Unix write () функция (libc) - PullRequest
       1

Unix write () функция (libc)

0 голосов
/ 15 сентября 2010

Я делаю приложение на C в Unix, которое использует необработанный ввод tty.

Я вызываю write () для символов на дисплее, но хочу манипулировать курсором:

ssize_t
write(int d, const void *buf, size_t nbytes);

Я заметил, что если buf имеет значение 8 (я имею в виду char tmp = 8, затем передаю & tmp), он будет перемещать курсор / указатель назад на экране.

Мне было интересно, где я могу найти все коды, например, я хочу переместить курсор вперед, но я не могу найти его через Google.

Есть ли страница со списком всего кода для функции write (), пожалуйста?

Большое спасибо,

Jary

Ответы [ 3 ]

2 голосов
/ 15 сентября 2010

8 - это просто код ascii для возврата. Вы можете набрать man ascii и просмотреть все значения (на странице руководства в моем окне Ubuntu есть более дружественные имена для значений). Если вы хотите делать более сложные вещи, вы можете посмотреть на библиотеку, такую ​​как ncurses.

2 голосов
/ 15 сентября 2010

Вы только что обнаружили, что символьный код 8 является символом возврата (control-H).

Возможно, вам лучше всего использовать библиотеку curses для управления экраном. Тем не менее, вы можете узнать, о чем знает curses, управляющих последовательностями, используя infocmp для декомпиляции записи terminfo для вашего терминала. Формат не особенно прост для понимания, но он относительно всеобъемлющий. Альтернатива состоит в том, чтобы найти руководство для терминала, которое, как правило, довольно сложно.

Например, я использую цветное окно Xterm; infocmp говорит:

#   Reconstructed via infocmp from file: /usr/share/terminfo/78/xterm-color
xterm-color|nxterm|generic color xterm,
    am, km, mir, msgr, xenl,
    colors#8, cols#80, it#8, lines#24, ncv@, pairs#64,
    acsc=``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~,
    bel=^G, bold=\E[1m, clear=\E[H\E[2J, cr=^M,
    csr=\E[%i%p1%d;%p2%dr, cub=\E[%p1%dD, cub1=^H,
    cud=\E[%p1%dB, cud1=^J, cuf=\E[%p1%dC, cuf1=\E[C,
    cup=\E[%i%p1%d;%p2%dH, cuu=\E[%p1%dA, cuu1=\E[A,
    dch=\E[%p1%dP, dch1=\E[P, dl=\E[%p1%dM, dl1=\E[M, ed=\E[J,
    el=\E[K, enacs=\E)0, home=\E[H, ht=^I, hts=\EH, il=\E[%p1%dL,
    il1=\E[L, ind=^J,
    is2=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8, kbs=^H,
    kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
    kdch1=\E[3~, kf1=\E[11~, kf10=\E[21~, kf11=\E[23~,
    kf12=\E[24~, kf13=\E[25~, kf14=\E[26~, kf15=\E[28~,
    kf16=\E[29~, kf17=\E[31~, kf18=\E[32~, kf19=\E[33~,
    kf2=\E[12~, kf20=\E[34~, kf3=\E[13~, kf4=\E[14~,
    kf5=\E[15~, kf6=\E[17~, kf7=\E[18~, kf8=\E[19~, kf9=\E[20~,
    kfnd=\E[1~, kich1=\E[2~, kmous=\E[M, knp=\E[6~, kpp=\E[5~,
    kslt=\E[4~, meml=\El, memu=\Em, op=\E[m, rc=\E8, rev=\E[7m,
    ri=\EM, rmacs=^O, rmcup=\E[2J\E[?47l\E8, rmir=\E[4l,
    rmkx=\E[?1l\E>, rmso=\E[m, rmul=\E[m,
    rs2=\E[m\E[?7h\E[4l\E>\E7\E[r\E[?1;3;4;6l\E8, sc=\E7,
    setab=\E[4%p1%dm, setaf=\E[3%p1%dm, sgr0=\E[m, smacs=^N,
    smcup=\E7\E[?47h, smir=\E[4h, smkx=\E[?1h\E=, smso=\E[7m,
    smul=\E[4m, tbc=\E[3g, u6=\E[%i%d;%dR, u7=\E[6n,
    u8=\E[?1;2c, u9=\E[c,

Содержит информацию о символах рисования блоков, кодовых последовательностях, генерируемых функциональными клавишами, различных последовательностях перемещения курсора и т. Д.

Вы можете узнать больше о X / Open Curses (v4.2) в HTML. Однако это официально устарело и заменено X / Open Curses v7 , который можно бесплатно скачать в формате PDF.

1 голос
/ 15 сентября 2010

Если вы используете write просто для того, чтобы иметь низкоуровневое управление курсором, я думаю, что вы используете неправильный инструмент для работы. Есть коды команд для многих типов терминалов. Коды VT100, например, представляют собой последовательности вида "\x1b[...", но вместо того, чтобы отправлять необработанные коды, было бы намного лучше использовать библиотеку, подобную ncurses.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...