手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>网站运营>建站经验>列表

第11章 终端I/O

来源:互联网 作者:west263.com 时间:2008-04-16
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!

· 要了解某些shell,例如Kornshell在以交互方式输入时都使终端处于回送状态
。这些she
ll是提供命令行编辑的shell,因此在每次输入一条交互命令时都处理终端状态。
所以假如
在这种shell下调用此程式,并且用QUIT字符使其夭折,则这种shell能够恢复回送
状态。不
提供命令行编辑的shell,例如Bourne shell和Cshell将使程式夭折,并使终端仍
处于不回
送状态。假如我们对终端做了这种操作,则stty命令能使终端回复到回送状态。

· 我们使用标准I/O读、写控制终端。我们特地将流配置为不带缓存的,否则在流
的读、写
之间可能会有某些相互作用(这样我们就需调用fflush)。我们也可使用不带缓存的
I/O(第三
章),但是在这种情况下就要用read来实现getc。
· 我们最多只取8个字符作为口令字。输入的多余字符则被忽略。
程式119调用getpass并且打印我们所输入的。这只是为了验证ERASE和KILL字符
在正常工
作(如同他们在规范方式下应该的那样)。
程式119〓调用getpass函数
调用getpass函数的程式完成后,为了安全起见,应清除存放过用户键入的文本口
令字的存
储区。假如该程式会产生其他用户能坊的core文档(回忆102节,core的系统默认
许可权使
每个用户都能读他),或假如某个其他进程设法能够读该进程的存储空间,则他
们就能读
到口令字。
1111〓非规范方式
将termios结构中c-lflag字段的ICANON标志关闭就使终端处于非规范方式。在非规
范方式中
,输入数据不装配成行。不处理下列特别字符:ERASE、KILL、EOF、NL、EOL、EO
L2、CR、R
EPRINT、STATUS和WERASE。
如前所述,规范方式是容易的〖CD2〗系统每次返回一行。但在非规范方式下,系
统怎样才
能知道在什么时候将数据返回给我们呢?假如他一次返回一个字节,那么系统开销
就很大。(
回忆图31,从中能够看到每次读一个字节的开销会多大。每次使返回的数据加倍
,就使系
统调用的开销减半。)在起动读数据之前,我们往往不知道要读多少数据,所以系
统不能总
是返回多个字节。
解决方法是:当已读了指定量的数据后,或已过了给定量的时间后,即通知系
统返回。
这种技术使用了termios结构中c-cc数组的两个变量:MIN和TIME。C-CC数组中的这
两个元素
的下标名为:VMIN和VTIME。
MIN说明一个read返回前的最小字节数。TIME说明等待数据到达的分秒数(秒的1/
10为分
秒)。有下列四种情形:
A:MIN>0,TIME>0
TIME说明一个字节间的计时器,在接到第一个字节时才起动他。在该计时器超时之
前,若已
接到MIN个字节,则read返回MIN个字节。假如在接到MIN个字节之前,该计时器已
超时,则r
ead返回已接收到的字节(因为只有在接到第一个字节时才起动,所以在计时器超时
时,至少
返回1个字节)。在这种情形中,在接到第一个字节之前,调用者阻塞。假如在调用
read时数
据已可用,则这如同在read后,数据立即被接收到相同。
B:MIN>0,TIME==0
已接到了MIN个字节时,read才返回。这能够造成会限期的阻塞read。
C:MIN==0,TIME>0
TIME指定了一个调用read时起动的读计时器。(和A相比较,两者是不同的)。在接
到1个字节
或该计时器超时时,read即返回。假如是计时器超时,则read返回0。
D:MIN==0,TIME==0
假如有数据可用,则read最多返回所需要的字节数。假如无数据可用,则read立即
返回0。

在任何这些情形中,MIN只是最小值。假如程式需要的数据多于MIN个字了,那是他
是可能接
收到所需要的字节数的。这也适用于MIN==0的情形A和B。
图117摘要列出非规范方式下的四种不同情形。在图中,nbytes是read的第三个
参数(返回
的最大字节数)。
P353
图117〓非规范输入的四种情形
POSIX1允许下示VIME和VTIME的值分别和VEOF和VEOL相同。确实,SVR4就是这样
做的。这
样就提供了向系统V早期版本的兼容性。问题是从非规范方式转换为规范方式时,
必须恢复V
EOF和VEOL,假如不这样做,那么VMIN等于VEOF,并且他已被配置为典型值1,于是
文档结束
字符就变成Control-A。解决这一问题的最简方法是:在转入非规范方式时将整个
termios结
构保存起来。在以后再转回规范方式时恢复他。
实例
程式1110定义了函数tty-break和tty-raw,他们将终端分别配置为cbreak和raw
(原始)方
式(术语cbreak和raw来自于Version 7的终端驱动程式)。tty-reset函数的功能是
将终端恢
复为以前的工作方式。其中还提供了另外两个函数:tty-atexit,tty-termios。t
ty-atexit
可被登记为终止处理程式,以确保exit恢复终端工作方式。tty-termios则返回一
个指向原
先的规范方式termios结构的指针。在第十八章的调制解调器拨号程式中将使用所
有这些函
数。
P355
程式1110〓将终端方式配置为原始或cbreak方式
我们对cbreak方式的定义是:
· 非规范方式。如本节开始处所述,这种方式不对某些输入特别字符进行处理。
这种方式
仍对信号进行处理,所以用户能够键入任一终端产生的信号。调用者应当捕获这些
信号,否
则这种信号就可能终止程式,并且终端将仍处于cbreak方式。
作为一般规则,在写更改终端方式的程式时,应当捕获大多数信号,以便在程式终
止前恢复
终端方式。
· 关闭回送(ECHO)标志
· 每次输入一个字节。为此将MIN配置为1,将TIME配置为0。这是图117中的情
形B。至少
有一个字节可用时,read再返回。
我们对原始方式的定义是:

文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!