终端I/O的工作方式tcsetattr tcgetattr

终端I/O有两种不同的工作方式:

  1. 规范方式输入处理。在这种方式中,终端输入以行为单位进行处理。对于每个读要求,终端驱动程序最多返回一行。
  2. 非规范方式输入处理。输入字符不以行为单位进行装配。

如果不作特殊处理,则默认方式是规范方式。

V7和BSD类的终端驱动程序支持三种终端输入方式:

  1. 精细加工方式(输入装配成行,并对特殊字符进行处理);
  2. 原始方式(输入不装配成行,也不对特殊字符进行处理);
  3. 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位。
  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值