Unix write()函数(libc)

时间:2010-09-15 05:25:32

标签: unix cursor

我在Unix中使用原始tty输入创建一个C应用程序。

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

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

我注意到如果buf的值为8(我的意思是char tmp = 8,然后传递& tmp),它会在屏幕上向后移动光标/指针。

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

是否有一个页面列出了write()函数的所有代码?

非常感谢,

Jary

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

您刚刚发现字符代码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中找到有关X/Open Curses(v4.2)的更多信息。但是,这已被正式废弃,被X/Open Curses v7取代,您可以免费下载PDF格式。

答案 2 :(得分:1)

如果你正在使用write只是因为你有低级别的光标控制,我认为你正在使用错误的工具来完成工作。有许多类型的终端的命令代码。例如,VT100代码是"\x1b[..."形式的序列,但不是发送原始代码,使用像ncurses这样的库会好得多。