POSIX终端接口
大多数系统都支持POSIX终端接口,POSIX终端通过一个termios结构来进行控制,该结构定义在termios.h文件中。
termios结构
struct termios
{
tcflag_t c_iflag; /* 输入选项标志 */
tcflag_t c_oflag; /* 输出选项标志 */
tcflag_t c_cflag; /* 控制选项标志 */
tcflag_t c_lflag; /* 本地选项标志 */
cc_t c_cc[NCCS]; /* 控制特性 */
};
c_iflag成员
Flag Description
GNBRK 忽略输入中的BREAK状态
BRKINT 如果设置了IGNBRK,将忽略BREAK。如果没有设置,但是设置了BRKINT,那么BREAK将使得输入和输出队列被刷新,如果终端是一个前台进程 组的控制终端,这个进程组中所有进程将收到SIGINT信号。如果既未设置IGNBRK也未设置BRKINT,BREAK将视为NUL同义字符,除非设置 了PARMRK,这种情况下被视为序列/377/0/0
IGNPAR 忽略桢错误和奇偶校验错误
PARMRK 如果没有设置IGNPAR,在有奇偶校验错误或者桢错误的字符前插入/377/0。如果既没有设置IGNPAR也没有设置PARMRK,将所有奇偶校验错误或者桢错误的字符视为/0。
INPCK 启用输入奇偶校验检测。
ISTRIP 去掉第八位。
INLCR 将输入的NL翻译为CR。
IGNCR 忽略输入中的回车。
ICRNL 将输入中的回车翻译为新行字符(除非设置了IGNCR)。
IUCLC (不属于POSIX)将输入中的大写字母映射为小写字母。
IXON 启用输出的XON/XOFF流控制
IXANY (不属于POSIX。1;XSI)允许任何字符来重新开始输出。
IXOFF 启用输入的XON/XOFF流控制
IMAXBEL (不属于POSIX)当输入队列满时响铃。LINUX没有实现该位,总是将其视为已设置。
c_oflag成员
Flag Description
OPOST 启用具体实现自行定义的输出。
OLCUC (不属于POSIX)将输出中的小写字母映射为大写字母。
ONLCR (XSI)将输出中的新行符映射为回车-换行
OCRNL 将输出中的回车映射为新行符。
ONOCR 不在第0列输出回车。
ONLRET 不输出回车。
OFILL 发送填充字符作为延时。
OFDEL (不属于POSIX)填充字符是ASCII DEL(0177)。如果不设置填充字符则是ASCII NUL。
NLDLY 新行延时掩码。取值为NL0和NL1。
CRDLY 回车延时掩码。取值为CR0,CR1,CR2或CR3。
TABDLY 水平跳格延时掩码。取值为TAB0,TAB1,TAB2,TAB3(或XTABS)。取值为TAB3,即XTABS,将扩展跳格为空格(每个跳格符填充8个空格)。
BSDLY 回车延时掩码。取值为BS0或BS1.(从来没有被实现)
VTDLY 竖直跳格掩码。取值为VT0或VT1。
FFDLY 进表延时掩码。取值为FF0或者FF1。
c_cflag成员
Flag Description
CBAUD (不属于POSIX)波特率掩码(4+1位)。
CBAUDEX (不属于POSIX)扩展的波特率掩码(1位),包含在CBAUD中。
CSIZE 字符长度掩码。取值为CS5,CS6,CS7或CS8。
CSTOPB 设置两个停止位。
CREAD 打开接受者。
PARENB 允许输出产生奇偶信息以及输入的奇偶校验。
PARODD 输入和输出是奇校验
HUPCL 在最后一个进程关闭设备后,降低MODEM控制线(挂断)。
CLOCAL 忽略MODEM控制线。
LOBLK (不属于POSIX)从非当前SHELL层阻塞输出(用于sh1)。
CIBAUD (不属于POSIX)输入速度的掩码。CIBAUD各位的值与CBAUD各位相同,左移了IBSHIFT位。
CRTSCTS (不属于POSIX)启用RTS/CTS(硬件)控制流。
c_lflag成员
Flag Description
ISIG 当接收到字符INTR,QUIT,SUSP或DSUSP时,产生相应的信号。
XCASE (不属于POSIX;LINUX下不支持)如果同时设置了ICANON,终端只有大写。输入被转换为小写,除了以/前缀的字符。输出时,大写字符被前缀/,小写字符被转换成大写。
ECHO 回显输入字符。
ECHOE 如果同时设置了ICANON,字符ERASE擦除前一个输入字符,WERASE擦除前一个词。
ECHOK 如果同时设置了ICANON,字符KILL删除当前行。
ECHONL 如果同时设置了ICANON,回显字符NL,即使没有设置ECHO。
ECHOCTL (不属于POSIX)如果同时设置了ECHO,除了TAB,NL,START和STOP之外的ASCII控制信号被回显为^x,这里X是比控制信号大0x40的ASCII码。例如字符0x08(BS)被回显为^H。
ECHOPRT (不属于POSIX)如果同时设置了ICANON和IECHO,字符在删除的同时被打印。
ECHOKE (不属于POSIX)如果同时设置了ICANON,回显KILL时将删除一行中的每个字符,如同指定了ECHOE和ECHORPT一样。
DEFECHO (不属于POSIX)只在一个进程读的时候回显。
FLUSHO (不属于POSIX;LINUX不支持)输出被刷新。这个标志可以通过键入字符DISCARD来打开和关闭。
NOFLSH 禁止产生SIGINT,SIGQUIT和SIGSUSP信号时刷新输入和输出队列。
TOSTOP 向试图写控制终端的后台进程组发送SIGTTOU信号。
PENDIN (不属于POSIX;LINUX不支持)在读入一个字符时,输入队列中的所有字符被重新输出。(bash用他来处理typeahead)。
IEXTEN 启用实现自定义的输入处理。这个标志必须与ICANON同时使用,才能解释特殊字符EOL2,LNEXT,REPRINT和WERASE,IUCLC标志才有效。
c_cc数组成员
Flag Description
VINTR (003,ETX,Ctrl-C,or also 0177, DEL, rubout)中断字符。发送SIGINT信号。当设置ISIG时可被识别,不再作为输入传递。
VQUIT (034,FS,Ctrl-/)退出字符。发出SIGQUIT信号。当设置ISIG时可被识别,不再作为输入传递。
VERASE (0177, DEL, rubout, or 010, BS, Ctrl-H, or also #) 删除字符。删除上一个还没有删掉的字符,但不删除上一个 EOF 或行首。当设置 ICANON 时可被识别,不再作为输入传递。
VKILL (025, NAK, Ctrl-U, or Ctrl-X, or also @) 终止字符。删除自上一个 EOF 或行首以来的输入。当设置 ICANON 时可被识别,不再作为输入传递。
VEOF (004, EOT, Ctrl-D) 文件尾字符。更精确地说,这个字符使得 tty 缓冲中的内容被送到等待输入的用户程序中,而不必等到 EOL。如果它是一行的第一个字符,那么用户程序的 read() 将返回 0,指示读到了 EOF。当设置 ICANON 时可被识别,不再作为输入传递。
VMIN 非 canonical 模式读的最小字符数。 VEOL (0, NUL) 附加的行尾字符。当设置 ICANON 时可被识别。 VTIME 非 canonical 模式读时的延时,以十分之一秒为单位。 VEOL2 (not in POSIX; 0, NUL) 另一个行尾字符。当设置 ICANON 时可被识别。
VEOL (0, NUL) 附加的行尾字符。当设置 ICANON 时可被识别。
VTIME 非 canonical 模式读时的延时,以十分之一秒为单位。
VEOL2 (not in POSIX; 0, NUL) 另一个行尾字符。当设置 ICANON 时可被识别。
VSWTCH (not in POSIX; not supported under Linux; 0, NUL) 开关字符。(只为 shl 所用。)
VSTART (021, DC1, Ctrl-Q) 开始字符。重新开始被 Stop 字符中止的输出。当设置 IXON 时可被识别,不再作为输入传递。
VSTOP (023, DC3, Ctrl-S) 停止字符。停止输出,直到键入 Start 字符。当设置 IXON 时可被识别,不再作为输入传递。
VSUSP (032, SUB, Ctrl-Z) 挂起字符。发送 SIGTSTP 信号。当设置 ISIG 时可被识别,不再作为输入传递。
VDSUSP (not in POSIX; not supported under Linux; 031, EM, Ctrl-Y) 延时挂起信号。当用户程序读到这个字符时,发送 SIGTSTP 信号。当设置 IEXTEN 和 ISIG,并且系统支持作业管理时可被识别,不再作为输入传递。
VLNEXT (not in POSIX; 026, SYN, Ctrl-V) 字面上的下一个。引用下一个输入字符,取消它的任何特殊含义。当设置 IEXTEN 时可被识别,不再作为输入传递。
VWERASE (not in POSIX; 027, ETB, Ctrl-W) 删除词。当设置 ICANON 和 IEXTEN 时可被识别,不再作为输入传递。
VREPRINT (not in POSIX; 022, DC2, Ctrl-R) 重新输出未读的字符。当设置 ICANON 和 IEXTEN 时可被识别,不再作为输入传递。
VDISCARD (not in POSIX; not supported under Linux; 017, SI, Ctrl-O) 开关:开始/结束丢弃未完成的输出。当设置 IEXTEN 时可被识别,不再作为输入传递。
VSTATUS (not in POSIX; not supported under Linux; status request: 024, DC4, Ctrl-T).