终端I/O有两种不同的工作方式:
- 规范方式输入处理。在这种方式中,终端输入以行为单位进行处理。对于每个读要求,终端驱动程序最多返回一行。
- 非规范方式输入处理。输入字符不以行为单位进行装配。
如果不作特殊处理,则默认方式是规范方式。
V7和BSD类的终端驱动程序支持三种终端输入方式:
- 精细加工方式(输入装配成行,并对特殊字符进行处理);
- 原始方式(输入不装配成行,也不对特殊字符进行处理);
- cbreak方式(输入不装配成行,但对某些特殊字符进行处理)。
2.termios结构
各个字段的选项如下(不是所有UNIX系统都支持):
c_iflag:
- BRKINT:接到BREAK时产生SIGINT;
- ICRNL:将输入的CR转换为NL;
- IGNBRK:忽略BREAK条件;
- IGNCR:忽略CR;
- IGNPAR:忽略奇偶错字符;
- IMAXBEL:在输入队列空时振铃;
- INLCR:将输入的NL转换为CR;
- INPCK:打开输入奇偶校验;
- ISTRIP:剥除输入字符的第8位;
- IUCLC:将输入的大写字符转换成小写字符(仅SVR4);
- IXANY:使任一字符都重新起动输出;
- IXOFF:使起动/停止输入控制流起作用;
- IXON:使起动/停止输出控制流起作用;
- PARMRK:标记奇偶错;
c_oflag:
- BSDLY:退格延迟屏蔽(仅SVR4);
- CRDLY:CR延迟屏蔽(仅SVR4);
- FFDLY:换页延迟屏蔽(仅SVR4);
- NLDLY:NL延迟屏蔽(仅SVR4);
- OCRNL:将输出的CR转换为NL(仅SVR4);
- OFDEL:填充符为DEL,否则为NUL(仅SVR4);
- OFILL:对于延迟使用填充符(仅SVR4);
- OLCUC:将输出的小写字符转换为大写字符(仅SVR4);
- ONLCR:将NL转换为CR-NL;
- ONLRET:NL执行CR功能(仅SVR4);
- ONOCR:在0列不输出CR(仅SVR4);
- ONOEOT:在输出中删除EOT字符(仅4.3+BSD);
- OPOST:执行输出处理;
- OXTABS:将制表符扩充为空格(仅4.3+BSD);
- TABDLY:水平制表符延迟屏蔽(仅SVR4);
- VTDLY:垂直制表符延迟屏蔽(仅SVR4);
c_cflag:
- CCTS_OFLOW:输出的CTS流控制(仅4.3+BSD);
- CIGNORE:忽略控制标志(仅4.3+BSD);
- CLOCAL:忽略解制解调器状态行;
- CREAD:启用接收装置;
- CRTS_IFLOW:输入的RTS流控制(仅4.3+BSD);
- CSIZE:字符大小屏蔽;
- CSTOPB:送两个停止位,否则为1位;
- HUPCL:最后关闭时断开;
- MDMBUF:经载波的流控输出(仅4.3+BSD);
- PARENB:进行奇偶校;
- PARODD:奇校,否则为偶校;
c_lflag:
- ALTWERASE:使用替换WERASE算法(仅4.3+BSD);
- ECHO:进行回送;
- ECHOCTL:回送控制字符为^(char);
- ECHOE:可见擦除符;
- ECHOK:回送kill符;
- ECHOKE:kill的可见擦除;
- ECHONL:回送NL;
- ECHOPRT:硬拷贝的可见擦除方式;
- FLUSHO:刷清输出;
- ICANON:规范输入;
- IEXTEN:使扩充的输入字符处理起作用;
- ISIG:使终端产生的信号起作用;
- NOFLSH:在中断或退出键后不刷清;
- NOKERNINFO:STATUS不使内核输出(仅4.3+BSD);
- PENDIN:重新打印;
- TOSTOP:对于后台输出发送SIGTTOU;
- XCASE:规范大/小写表示(仅SVR4);
所有列出的选择标志(除屏蔽标志外)都用一或多位表示,而屏蔽标志则定义多位。屏蔽标志有一个定义名,每个值也有一个名字。例如,为了设置字符长度,首先用字符长度屏蔽标志CSIZE将表示字符长度的位清0,然后设置下列值之一:CS5、CS6、CS7或CS8。由SVR4支持的6个延迟值也有屏蔽标志:BSDLY、CRDLY、FFDLY、NLDLY、TABDLY和VTDLY。
各个标志的含义如下:
- ALTWERASE:(c_lflag, 4.3+BSD)此标志设置时,若输入了WERASE字符,则使用一个替换的字擦除算法。它不是向后移动到前一个白空字符为止,而是向后移动到第一个非字母、数字符为止。
- BRKINT:(c_iflag, POSIX.1)若此标志设置,而IGNBRK未设置,则在接到BREAK时,输入、输出队列被刷清,并产生一个SIGINT信号。如果此终端设备是一个控制终端,则将此信号送给前台进程组各进程。如果IGNBRK和BRKINT都没有设置,但是设置了PARMRK,则BREAK被读作为三个字节序列/377,/0和/0,如果PARMRK也没有设置,则BREAK被读作为单个字符/0。
- BSDLY:(c_oflag, SVR4)退格延迟屏蔽,此屏蔽的值是BS0或BS1。
- CCTS_OFLOW:(c_cflag, 4.3+BSD)输出的CTS流控制。
- CIGNORE:(c_cflag, 4.3+BSD)忽略控制标志。
- CLOCAL:(c_cflag, POSIX.1)如若设置,则忽略调制解调器状态线。这通常意味着该设备是本地连接的。若此标志未设置,则打开一个终端设备常常会阻塞到调制解调器回应。
- CRDLY:(c_oflag, SVR4)回车延迟屏蔽。此屏蔽的值是CR0、CR1、CR2和CR3。
- CREAD:(c_cflag, POSIX.1)如若设置,则接收装置被启用,可以接收字符。
- CRTS_IFLOW:(c_cflag, 4.3+BSD)输入的RTS流控制。
- CSIZE:(c_cflag, POSIX.1)此字段是一个屏蔽标志,它指明发送和接收的每个字节的位数。此长度不包括可能有的奇偶校验位。由此屏蔽定义的字段值是CS5、CS6、CS7和CS8,分别表示每个字节包含5、6、7和8位。