Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix write()函数(libc)_Unix_Cursor - Fatal编程技术网

Unix write()函数(libc)

Unix write()函数(libc),unix,cursor,Unix,Cursor,我正在Unix中制作一个使用原始tty输入的C应用程序 我正在对显示器上的字符调用write(),但我想操纵光标: ssize_t write(int d, const void *buf, size_t nbytes); 我注意到,如果buf的值为8(我的意思是char tmp=8,然后传递&tmp),它将在屏幕上向后移动光标/指针 我想知道我在哪里可以找到所有的代码,例如,我想向前移动光标,但我似乎无法通过谷歌找到它 有没有列出write()函数所有代码的页面 多谢各位 Jary如果您使用

我正在Unix中制作一个使用原始tty输入的C应用程序

我正在对显示器上的字符调用write(),但我想操纵光标:

ssize_t
write(int d, const void *buf, size_t nbytes);
我注意到,如果buf的值为8(我的意思是char tmp=8,然后传递&tmp),它将在屏幕上向后移动光标/指针

我想知道我在哪里可以找到所有的代码,例如,我想向前移动光标,但我似乎无法通过谷歌找到它

有没有列出write()函数所有代码的页面

多谢各位


Jary

如果您使用
write
只是为了实现低级光标控制,我认为您使用了错误的工具。有许多类型的终端的命令代码。例如,VT100代码是格式为“\x1b[…”的序列,但与其发送原始代码,不如使用像ncurses这样的库。

如果您使用
write
只是为了实现低级光标控制,我认为您使用了错误的工具来执行此任务。许多类型的终端都有命令代码。例如,VT100代码是
“\x1b”形式的序列[…”
,但与其发送原始代码,不如使用像ncurses这样的库。

8只是用于退格的ascii代码。您可以键入并查看所有值(我的Ubuntu框上的手册页有更友好的值名)。如果你想做更复杂的事情,你可能想看看像ncurses这样的库。

8只是用于退格的ascii码。你可以键入并查看所有值(我的Ubuntu框上的手册页有更友好的值名称)。如果您想做更复杂的事情,您可能需要查看类似ncurses的库。

您刚刚发现字符代码8是backspace(control-H)

您可能最好使用curses库来管理屏幕。但是,您可以通过使用
infocmp
为您的终端反编译terminfo条目来了解curses了解的控制序列。格式不是特别容易理解,但它相对全面。另一种方法是找到对于终端,这往往是相当困难的

例如,我使用的是彩色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,
它包含有关方框图形字符、由功能键生成的代码序列、各种光标移动序列等的信息


你可以在HTML中找到更多关于(v4.2)的信息。但是,这已经被正式淘汰,取而代之的是,你可以在PDF中免费下载。

你刚刚发现字符代码8是退格(control-H)

您可能最好使用curses库来管理屏幕。但是,您可以通过使用
infocmp
为您的终端反编译terminfo条目来了解curses了解的控制序列。格式不是特别容易理解,但它相对全面。另一种方法是找到对于终端,这往往是相当困难的

例如,我使用的是彩色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,
它包含有关方框图形字符、由功能键生成的代码序列、各种光标移动序列等的信息


您可以在HTML中找到更多关于(v4.2)的信息。但是,这已经正式过时,被取代,您可以在PDF中免费下载。

非常感谢。这是一个非常有用的解决方案,我将尝试一下。谢谢!为了进一步解释,在上面的infocmp输出中有一个key=value关联列表,例如home=\E[H.这个特殊的选项意味着您可以通过先打印ASCII 27字符(称为ESCAPE或ESC-您将在
man ASCII
中看到它),然后是左方括号(ASCII 91十进制),然后是字母H(ASCII 72),将光标移回屏幕的左上角.基本上,对于每种能够将光标移回原位的终端软件/设备,infocmp都会报告要使用的字符,这样软件就可以在列表中查找“home”并在所有终端上工作。只需稍微玩一下这些序列就可以了…例如,在许多终端上,ESCAPE[31m到ESCAPE][37m将更改打印文本的前景色,然后ESCAPE[30m将其重置为默认值。这对于将shell提示符设置为从键入和命令输出中视觉上突出的内容非常有用-在这种情况下,完整的ncurses库不会有多大用处(您在编写自己的应用程序时可以使用它)。您可以在google“shell prompts”上搜索更多此类示例。非常感谢。这是一个非常有用的解决方案,我会尝试一下。谢谢!为了进一步解释,在上面的infocmp输出中有一个key=value关联列表,例如home=\E[H.这个特殊的选项意味着您可以通过先打印ASCII 27字符(称为ESCAPE或ESC-您将在
man ASCII
中看到它),然后是左方括号(ASCII 91十进制),然后是字母H(ASCII 72),将光标移回屏幕的左上角.基本上,对于每种能够将光标移回原位的终端软件/设备,infocmp都会报告要使用的字符,这样软件就可以在列表中查找“home”并在所有终端上工作。只需稍微玩一下这些序列就可以了…例如,在许多终端上,ESCAPE[31m到ESCAPE][37m将更改打印文本的前景色,然后ESCAPE[30m将其重置为默认值。这对于将shell提示符设置为从键入和命令输出中视觉上突出的内容非常有用-在这种情况下,完整的ncurses库不会有多大用处(你可以在编写自己的应用程序时使用它)。你可以在谷歌上搜索“shell提示”来获取更多类似的例子。