111〓引言
在操作系统中,终端I/O处理是个很繁琐的部分,Unix也不例外。在很多版本
的Unix手
册中,终端I/O的手册页常常是最长部分之一。
在七十年代后期,Unix终端I/O处理发展成两种不同的风格。一种是系统Ⅲ在V
ersion 7
的基础上进行了很多改变而形成的,这种风格由系统Ⅴ沿续下来;另一种则是Ver
sion 7的
风格,他正成为贝克莱类系统的标准组成部分。如同信号相同,POSIX.1在这两种
风格的基
础上定制了终端I/O标准。本章将介绍POSIX.1的终端函数,连同SVR4和43 B
SD的增加
部分。
终端I/O的用途很广泛,包括:终端、电脑之间的直接连接、调制解调器、打
印机等等
,所以他就变得很复杂。在后面的若干章中,我们研发了两个例示终端I/O的
程式:一
个是和PostScript打印机进行通信(第十七章),另一个是涉及调制解调器连同远程
的电脑
登录(第十八章)。
112〓综述
终端I/O有两种不同的工作方式:
1规范方式输入处理。在这种方式中,终端输入以行为单位进行处理。对于每个
读需要,
终端驱动程式最多返回一行。
2非规范方式输入处理。输入字符不以行为单位进行装配。
假如不作特别处理,则规范方式是默认方式。例如:若Shell的标准输入、输出是
终端,在
用read和Write将标准输入复制到标准输出时,则终端以规范方式进行工作,每次
read最多
返回一行。处理整个屏幕的程式,例如Ui编辑程式,使用非规范方式,其原因是其
命令是由
不以新行符终止的一个或几个字符组成的。另外,该编辑程式使用了若干特别字符
作为编辑
命令,所以他也不希望系统对特别字符进行处理。例如,Control-D字符通常是终
端的文档
结束符,但在Ui中他是向下滚动半个屏幕的命令。
Version 7和BSD类的终端驱动程式支持三种终端输入方式:
(a)精细加工方式(Cooked mode)(输入装配成行,并对特别字符进行处理),(b)原
始方式(输
入不装配成行,也不对特别字符进行处理),(c)cbreak方式输入不装配成行,但对
某些特别
字符进行处理)。程式1110显示了将终端配置为cbreak或原始方式的POSIX1函
数
POSIX1定义了11个特别输入字符,我们能够改变其中9个。在本章中已用到了
其中几个
字符,例如:文档结束符(通常是:Control-D),挂起字符(通常是:Control-Z)。
113节对其中每个字符都进行说明。
终端设备是由一般位于系统核内的终端驱动程式所控制的。每个终端设备有一个输
入队列,
一个输出队列,这如图111中所示。
图111〓终端设备的输入、输出队列的逻辑结构
对此图要说明下列几点:
· 假如需要回送,则在输入队列和输出队列之间有一个隐含的连接。
· 输入队列的长度MAX-INPUT(见图25)是有限值,当一个特定设备的输入队列已
经填满时
,系统作何种处理是依赖于实现的。当此发生时,大多数Unix系统回送响铃字符。
· 在图中没有显示另一个输入限制MAX-CANON,他是在一个规范输入行中的最大字
节数。
· 虽然输出队列通常也是有限长度,但是程式不能存取定义其长度的常数。这是
因为当输
出队列要填满时,系统核使写进程睡眠直至写队列中有可用的空间,所以程式无需
关心该队
列的长度。
· 我们将说明如何使用tcflush函数刷清输入或输出队列。和此相类似,在说明t
csetallr
函数时,我们将会了解到如何通知系统仅在输出队列空时改变一个终端的属性。(
例如,正
在改变输出属性时可能就要这样做。)我们也能通知系统,当他正在改变终端属性
时,丢弃
在输入队列中的任何东西。(假如我们正在改变输入属性,或在规范和非规范方
式之间进
行转换,则可能希望这样做,以免以错误的方式对以前输入的字符进行解释。)
大多数Unix系统在一个称为终端行规程的模块中进行规范处理。他是位于系统核类
属读、写
函数和实际设备驱动程式之间的模块,这示于图112中。
图112〓终端行规程
在124节中讨论流I/O系统连同在第十九章讨论伪终端时还将使用此图。
任何我们能够检测和更改的终端设备特性都包含在termios结构中。该结构在头文
件<termio
s.h>中定义,本章经常使用这一头文档。
struct termios {
tcflag-t c-iflag;〓〓〓/*输入标志*/
tcflag-t c-iflag;〓〓〓/*输出标志*/
tcflag-t c-iflag;〓〓〓/*控制标志*/
tcflag-t c-iflag;〓〓〓/*本地标志*/
cc-t c-cc[NCCS];/*控制字符*/
};
粗略而言,输入标志由终端设备驱动程式用来控制输入特性(剥除输入字节的第8位
,允许输
入奇偶校验等等),输出标法则控制输出特性(执行输出处理,将新行映照为CR/LF
等),控制
标志影响到RS-232串行线(忽略调制解调器的状态线,每个字符的一个或二个停止
位等等),
本地标志影响驱动程式和用户之间的界面(回送的开或关,虚拟的擦除符,允许终
端产生的
信号,对后台作业输出的控制停止信号等)。
类型tcflag-t的长度是以保持每个标志值。他经常被定义为unsigned long。c-cc
数组包含
了任何我们能够更改的特别字符。NCC3是该数组的长度,其典型值在11-18之间(大
多数Unix
实现支持的特别字符较POSIX1所定义的11个更多)。cc-t类型的长度是以保持每
个专用字
符,他典型的是unsigned char。
系统V的早期版本有一个名为<termio.h>的头文档,一个名为termio的数据结构,
为了区别
于这些名字,POSIX1在这些名字后加了一个s。
图113列出了任何我们能够更改以影响终端设备特性的终端标志。注意,POSIX
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




