终端io(一)

2016-02-25  本文已影响185人  千里山南

2016-02-25

终端io

终端io两种不同的工作方式:规范方式输入处理,以行为单位进行处理。非规范方式处理,输入字符不以行为单位。
默认情况下按照规范方式,如:shell的标准输入输出是终端,在用read和write将标准输入复制到标准输出时,终端将以规范方式进行工作,每次read最多返回一行。处理整个屏幕的程序,如Vi编辑器使用非规范方式。另外该编辑程序使用了若干特殊字符作为编辑命令,所以它也不希望系统对特殊字符进行处理,例如Ctrl-D通常是终端文件结束符,但在Vi中它是向下滚动半个屏幕的命令。终端设备是由一般位于内核中的终端驱动程序所控制的每个终端设备有一个输入队列,一个输出队列。

大多数unix系统在一个称谓终端行规程的模块中进行规范处理。它是位于内核类属读写函数和实际设备驱动程序之间的模块。
所有我们可以检测和更改的终端设备特性都包含在termios结构中

struct termios {
    tcflag_t c_iflag;
    tcflag_t c_oflag;
    tcflag_t c_cflag;
    tcflag_t c_lflag;
    cc_t c_cc[NCCS];
}

粗略而言,输入标志由终端设备驱动程序来控制输入特性,输出标志则控制输出特性,控制标识影响到RS-232串行线,本地标识影响驱动程序和用户之间的界面。
类型tcflag_t 的长度是以保持每个标志值。它常被定义为unsigned long。c_cc数组包含了所有可以更改的特殊字符。NCCS是该数组的长度,其典型值在11~18之间。cc_t类型的长度足以保持每个专用字符,典型的是unsigned char

特殊输入字符

POSIX定义了11个在输入时作特殊处理的字符
在POSIX的11个特殊字符中,可将其中的9个更改为几乎为任何值。不能更改的两个特殊字符是新行符合回车符,有些实施也不允许更改stop和start字符。为了进行修改只要更改termiso结构中c_cc数组的对应项。该数组中的元素都用名字作为下表进行引用。
POSIX中可以选择地禁止使用这些字符。若_POSIX_VDISABLE有效,则_POSIX_VDISABLE的值可以存放在c_cc数组的相应项中以进制使用该特殊字符。可以用pathconf和fpathconf函数查询此特征。

isatty可以用于检测输入输出是否为终端设备。
通常tcgetattr从内核中存取termios结构。调用tcsetattr设置属性。

上一篇下一篇

猜你喜欢

热点阅读