介绍
我阅读并且学习了有关于UNIX系统终端I/O相关的内容。在此记录一些比较关键的概念。引论
终端I/O十分复杂,原因之一是它应用于许多事物。综述
终端I/O的两种工作模式:规范模式输入处理(默认)、非规范模式输入处理。规范模式下,对于每一个读请求,终端驱动程序最多返回一行。
可以认为终端设备是由内核中的终端驱动程序控制的,每一个终端设备都有一个输入队列和一个输出队列。
开启回显功能时,在输入队列和输出队列之间有一个隐含连接。
输入队列长度是有限值。
输出队列虽然也有限,但是程序并不能获取这个值。在输出队列要填满时,内核会直接将写进程休眠。
大多是UNIX系统在一个称为终端行规程的模块中进行全部的规范处理。该模块在内核通用读写函数和实际设备驱动程序之间。
所有可以检测和更改的终端设备特性都包含在termios结构中。
使用tcsetattr和tcgetattr可以设置终端选项进而控制终端。
特殊输入字符
POSIX定义了11个在输入时要特殊处理的字符。在这11个特殊字符中,9个字符的值可以任意更改。
为了更改特殊字符,需要修改termios结构中的c_cc数组的相应项。
POSIX允许禁止使用这些字符。
终端标识
在大多数UNIX系统版本中,控制终端名字一直是/dev/tty。
规范模式与非规范模式
规范模式:发送一个请求,当一行已经输入以后,终端程序立即返回。以下几个条件造成读返回:
- 所请求的字节数已经读到时,无需读一个完整的行。
- 当读到一个行界定符号
- 捕捉到信号,并且该函数不再自动重启
非规范模式:时输入数据不装配成行,不处理特殊字符。当读取指定量的数据后,或者超过指定量的时间后,通知系统返回。该模式下没有关闭对信号的处理,用户始终可以键入一个触发终端产生信号的字符。
终端窗口大小
大多数UNIX系统都提供了一种跟踪当前终端窗口大小的方法,当窗口大小变化的时候,使内核通知前台进程组。内核未每个终端和伪终端都维护了一个winsize结构。