UNIX 终端I/O

介绍

我阅读并且学习了有关于UNIX系统终端I/O相关的内容。在此记录一些比较关键的概念。

引论

终端I/O十分复杂,原因之一是它应用于许多事物。

综述

终端I/O的两种工作模式:规范模式输入处理(默认)、非规范模式输入处理。

规范模式下,对于每一个读请求,终端驱动程序最多返回一行。

可以认为终端设备是由内核中的终端驱动程序控制的,每一个终端设备都有一个输入队列和一个输出队列。

开启回显功能时,在输入队列和输出队列之间有一个隐含连接。

输入队列长度是有限值。

输出队列虽然也有限,但是程序并不能获取这个值。在输出队列要填满时,内核会直接将写进程休眠。

大多是UNIX系统在一个称为终端行规程的模块中进行全部的规范处理。该模块在内核通用读写函数和实际设备驱动程序之间。

所有可以检测和更改的终端设备特性都包含在termios结构中。

使用tcsetattr和tcgetattr可以设置终端选项进而控制终端。

特殊输入字符

POSIX定义了11个在输入时要特殊处理的字符。在这11个特殊字符中,9个字符的值可以任意更改。

为了更改特殊字符,需要修改termios结构中的c_cc数组的相应项。

POSIX允许禁止使用这些字符。

终端标识

在大多数UNIX系统版本中,控制终端名字一直是/dev/tty。

规范模式与非规范模式

规范模式:发送一个请求,当一行已经输入以后,终端程序立即返回。以下几个条件造成读返回:

  1. 所请求的字节数已经读到时,无需读一个完整的行。
  2. 当读到一个行界定符号
  3. 捕捉到信号,并且该函数不再自动重启

非规范模式:时输入数据不装配成行,不处理特殊字符。当读取指定量的数据后,或者超过指定量的时间后,通知系统返回。该模式下没有关闭对信号的处理,用户始终可以键入一个触发终端产生信号的字符。

终端窗口大小

大多数UNIX系统都提供了一种跟踪当前终端窗口大小的方法,当窗口大小变化的时候,使内核通知前台进程组。内核未每个终端和伪终端都维护了一个winsize结构。