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

第11章 终端I/O

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

· 非规范方式。另外,还关闭了对信号产生字符(ISIG)和扩充输入字符的处理(I
EXTEN)。
关闭BRKINT,这样就使BREAK字符不再产生信号。
· 关闭回送(ECHO)标志。
· 关闭ICRNL、INPCK、ISTRIP和IXON标志。于是:不再将输入的CR字
符变换为
NL(ICRNL),使输入奇偶校验不起作用(INPCK),不再剥夺输入字节的第八位(STRI
P),不进
行输出流控制(IXON)。
· 八位字符(DS8),不产生奇偶位,不进行奇偶性检测(PARENB)。
· 禁止任何输出处理(OPOST)。
·每次输入一个字节(MIN=1,TIME=0)。
程式1111测试原始和cbreak方式。运行程式1111能够观察这两种终端工作方式
的工作情
况。
$ a.out
Enter raw mode characters,terminate with DELETE
4
33
133
62
63
60
1
键入DELETE
Enter cbreak mode characters,terminate with SIGINT
1 键入Control-A
10 键入退格
signal caught 键入中断
P357
程式1111〓测试原始和cbreak工作方式
在原始方式,输入的字符是Control-D(04)和特别功能键F7。在所用的终端上,此
功能键产
生6个字符:ESC(033),[(0133),2(062),3(063),0(0
60)和Z
(0172)]。注意,在原始方式下关闭了输出处理(~OPOST),所以在每个字
符后没有
得到回车符。另外也要注意的是,在cbreak方式下,不对输入特别字符进行处理(
所以对Con
trol-D、文档结束符和退格等不进行特别处理),但是对终端产生的信号则进行处
理。
1112〓终端的窗口大小
SVR4和贝克莱系统都提供了一种功能,用其能够对当前终端窗口的大小进行跟踪,
在窗口大
小发生变化时,使系统核通知前台进程组。系统核为每个终端和伪终端保存一个w
insize结
构。
struct winsize {
unsigned short ws-row; /*以字符表示的行数*/
unsigned short ws-col; /*以字符表示的列数*/
unsigned short ws-xpixel; /*水平长度(象素)(未使用)*/
unsigned short ws-ypixel; /*垂直长度(象素)(未使用)*/
此结构的作用是:
1用ioctl的TIOCGWINSZ命令能够取此结构的当前值。
2用ioctl的TIOCSWINSZ命令能够将此结构的新值存放到系统核中。假如此新值和
存放在系
统核中的当前值不同,则向前台进程组发送SIGWINCH信号。(注意,从图101中可
以看出,
此信号的系统默认动作是忽略他)。
3除了存放此结构的当前值连同在此值改变时产生一个信号以外,系统核对该结
构不进行
任何其他操作。对结构中的值进行解释完全是应用程式的工作。
提供这种功能的目的是,当窗口大小发生变化时通知应用程式(例如V1编辑程式)。
应用程式
接到此信号后,他能够取得窗口大小的新值,然后重画屏幕。
实例
程式1112打印当前窗口大小,然后睡眠。每次窗口大小改变时,就捕获到SIGWI
NCH信号,
然后打印新的窗口大小。我们必须用一个信号终止此程式。
P359
程式1112〓打印窗口大小
在一个带窗口的终端上运行此程式得到:
$ a.out
35 rows,80 columns 起始长度
SIGWINCH received 更改窗口大小:捕获到信号
40 rows,123 columns
SIGWINCH received 再一次
42 rows,33 columns
^? $ 键入中断以终止
1113〓termcap,terminfo和Curses
termcap的意思是终端性能(terminal capability),他涉及到文本文档/etc/term
cap和一套
读此文档的例程。termcap这种技术是在贝克莱为了支持Vi编辑器而发展起来的。
termcap文
件包含了对各种终端的说明:终端支持哪些功能(行、列数、是否支持退格等),如
何使终端
执行某些操作(清屏,将光标移动到指定位置等)。把这些信息从需要编译的程式中
取出来并
把他们放在易于编辑的文本文档中,这样就使得vi能在很多不同的终端上运行。

然后,支持termcap文档的一套例程也从vi编辑程式中抽取出来,放在一个单独的
curses(光
标)库中。为使这套库可被要进行屏幕处理的任何程式使用,增加了很多功能。

termcap这种技术不是很完善的。当越来越多的终端被加到该数据文档中时,为了
找到一个
特定的终端就需使用较长的时间扫描此文档。此数据文档也只用两个字符的名字来
标识不同
的终端属性。这些缺陷导致研发另一种新技术〖CD2〗terminfo及和其相关的curs
es库。在t
erminfo中,终端说明基本上是文本说明的编译版本,在运行时易于快速定位。te
rninfo由S
VR2开始使用,此后任何系统V版本都使用他。
系统V使用terminfo,而43 BSD则使用termcap。
Goodheard[1991]对terminfo和curses库进行了周详说明。Strang,Mui和O′
Reilly[
1991]则对termcap和terminfo进行了说明。
不论是termcap还是terminfo都致力于本章所述及的问题〖CD2〗更改终端的方式、
更改终端特别字符、处理窗口大小等等。他们所提供的是在各种终端上执行典型操
作(清屏,移动光标)的方法。另一方面,在本章所述问题方面curses,能提供更周详
的帮助。curses提供了很多函数,包括:配置原始方式、配置cbreak方式、打开和关
闭回送等等。但是curser是为字符终端设计的,而当前的趋势则是向以象素为基础的
图像终端发展。



1114〓摘要
终端有很多特征和选择项,其中大多数都可按需进行改变。在本章中,我们说明了
很多更改终端操作的函数〖CD2〗特别输入字符和选择标志的函数,介绍了可为终
端设备配置的各个终端特别字符连同很多选择项。

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