展望2011

《unix环境高级编程》通读学习笔记(三)(第11章)

上一篇 / 下一篇  2007-07-28 17:12:59 / 个人分类:unix环境高级编程的学习记录

n*mzf(d$j.I5Y0第11章 终端I/O51Testing软件测试网Z^F A] Q c

\.l$? U Cmp051Testing软件测试网2e{LlI.Q6jo-Z,D

11.1 引言
{/H+R9x8SK v2~0终端I/O的用途很广泛,包括:终端、计算机之间的直接连接、调制解调器、打印机等等,所以它就变得非常复杂。

P0d*]B!L _!b0Y[051Testing软件测试网NP8A)g.pr~Xx!K

11.2 综述51Testing软件测试网;x h z*hk _;|
终端I/O有两种不同的工作方式:
~+`f-wm'?5M0(1) 规范方式输入处理。在这种方式中,终端输入以行为单位进行处理。对于每个读要求,终端驱动程序最多返回一行。
bbuqzS m0(2) 非规范方式输入处理。输入字符不以行为单位进行装配。51Testing软件测试网#uL-P4H4a/JrW4V
如果不作特殊处理,则默认方式是规范方式。
MD`TVevy:}l:t Z \0终端设备是由一般位于内核中的终端驱动程序所控制的。每个终端设备有一个输入队列,一个输出队列。
Xn^lg&Y gc0`n0图11-1   终端设备的输入、输出队列的逻辑结构
+_3~V o/Q0p8_6E;D0大多数UNIX系统在一个称为终端行规程(terminal lined iscipline)的模块中进行规范处理。它是位于内核类属读、写函数和实际设备驱动程序之间的模块。51Testing软件测试网BZ5N3aOv8Q
图11-2   终端行规程
po [?4lWro&g0我们可以检测和更改的终端设备特性都包含在termios结构中。该结构在头文件<termios.h>中定义。51Testing软件测试网 bzE8oX!Y#u8j7d7m
表11 - 1列出了所有可以更改以影响终端设备特性的终端标志。
8C$|e:v?.yH hf F0表11 - 2列出了POSIX.1所定义的对终端设备进行操作的各个函数。

"J9X,z.W}&M6zl051Testing软件测试网9c%n!x|im

11.3 特殊输入字符51Testing软件测试网$Sv[\d L0L d4F
表11-3 终端在输入时作特殊处理的字符。
Q0o;Ns4W0在POSIX.1的11个特殊字符中,可将其中9个更改为几乎任何值。可选地允许禁止使用这些字符。

'h [P5j4W:[051Testing软件测试网L9Y5\%ETBR:Gk&nn

11.4 获得和设置终端属性
4@hb&F&B#[0使用函数tcgetattr和tcsetattr可以获得或设置termios。这样也就可以检测和修改各种终端选择标志和特殊字符,以使终端按我们所希望的方式进行操作。51Testing软件测试网FoD;hP[
——————————————————————————————————————————————
MYQSY_5U8x*z-e;y0#include <termios.h>51Testing软件测试网kf8[:f~G;_q
int tcgetattr(int filedes, struct termios *termptr);51Testing软件测试网P(vNd,Zy9ko0H:]
int tcsetattr(int filedes, int opt, const struct termios *termptr);
r`/z'j6f eO }0两个函数返回:若成功则为0,若出错则为-151Testing软件测试网j k^&S;G5G;fk
——————————————————————————————————————————————51Testing软件测试网z*XOh] \*`4ld!d

S bgR*g fe1L7a011.5 终端选择标志
-r e M:TvLW~O_011.6 stty命令

Oz;TM(B(v"n4@0上节说明的所有选择项,在程序中都可用tcgetattr和tcsetattr函数(见11.4节)进行检查和更改。在命令行中则用stty(1)命令进行检查和更改。stty(1)命令是表11-2中所列的头6个函数的界面。如果以-a选择项执行此命令,则显示终端的所有选择项

b}5f(D O6j:S F051Testing软件测试网-d sUgB

11.7 波特率函数51Testing软件测试网[;r?;g5XI
波特率(baud rate)是一个历史沿用的术语,现在它指的是“位 /每秒”。虽然大多数终端设备对输入和输出使用同一波特率,但是只要硬件许可,可以将它们设置为两个不同值。51Testing软件测试网(gw-l8p0k+sBPp
—————————————————————————————————————51Testing软件测试网Pt)m e,S0y3Js u
#include <termios.h>
f?-]hu_M5O(}+]0speed_t cfgetispeed(const struct termios *termptr);51Testing软件测试网;VY+E%WO]
speed_t cfgetospeed(const struct termios *termptr);51Testing软件测试网)E/u|@KbU R}
两个函数返回:波特率值
gkXp't0int cfsetispeed(struct termios *termptr,speed_t speed);
,q*tj-cH/BQe0int cfsetospeed(struct termios *termptr,speed_t speed);
a*T*L cU0两个函数返回:若成功为0,出错为-1。
$W&\ Z.Bkd_BE0—————————————————————————————————————51Testing软件测试网uRg t2A%P

51Testing软件测试网Ju+N Z ^2v/H1s)P%?`

11.8 行控制函数51Testing软件测试网y OlH/c o*J"~
下列四个函数提供了终端设备的行控制能力。
S:P*i'}2M D)~0——————————————————————————————————————
a DyA7p5z0#include <termios.h>51Testing软件测试网y)G Isf[
int tcdrain(int filedes) ;51Testing软件测试网FKYZ*S8V#U:iG
int tcflow(int filedes, int action);
m O1M,@2f0int tcflush(int filedes, int queue);51Testing软件测试网p(T Uw}
int tcsendbreak(int filedes, int duration);51Testing软件测试网E3?4m?m:m r.`8E*@0ha
四个函数返回:若成功则为0,若出错则为-1
gf$y ]%M3a0——————————————————————————————————————
"kPKdm"P0tcdrain函数等待所有输出都被发送。tcflow用于对输入和输出流控制进行控制。
"d3i%n%c:i6Ue NJ0tcflush函数刷清(抛弃)输入缓存(终端驱动程序已接收到,但用户程序尚未读)或输出缓存(用户程序已经写,但尚未发送)。51Testing软件测试网v-A1Y-Wn _!j)C9D
tcsendbreak函数在一个指定的时间区间内发送连续的 0位流。51Testing软件测试网_ {de&].V

C8{ RaUP p011.9 终端标识51Testing软件测试网$[?:e)r)Gf
在大多数UNIX系统中,控制终端的名字是/dev/tty。POSIX.1提供了一个运行时函数,可被调用来决定控制终端的名字。
/^(DH6c2n*~`0--------------------------------------------------------------------51Testing软件测试网!PRN e,ct4{U.T
#include <stdio.h>51Testing软件测试网2nS;jt A2sb
char * ctermid(char *ptr) ;
uJ&AuXn/vc,{v0返回:见下51Testing软件测试网e9O5y6V;nd
--------------------------------------------------------------------51Testing软件测试网A^qEH4pz
此函数的主要作用是帮助提高向其他操作系统的可移植性。51Testing软件测试网5v!P(] ^n5O?AA

51Testing软件测试网L8c(y4^PS

11.10 规范方式51Testing软件测试网6CAO}(R'J
规范方式很简单—发一个读请求,当一行已经输入后,终端驱动程序即返回。许多条件造成读返回。51Testing软件测试网e`vs-@ bp
1.所要求的字节数已读到时读即返回。
z1Y:o`(@ }T02.当读到一个行定界符时,读返回。
&ph4jot03.如果捕捉到信号而且该函数并不自动再起动(见10.5节),则读也返回。

1BR AM~0

Pi1_UE4RP [011.11 非规范方式51Testing软件测试网;yjXc"y{'T!J8m+|
将termios结构中c_lflag字段的ICANON标志关闭就使终端处于非规范方式。51Testing软件测试网]uL0II7RLU
当已读了指定量的数据后,或者已经过了给定量的时间后,即通知系统返回。这种技术使用了termios结构中c_cc数组的两个变量:MIN和TIME。51Testing软件测试网Z.h2s ~ Dgc,Qp
MIN说明一个read返回前的最小字节数。TIME说明等待数据到达的分秒数。
.Aeb)H`O+L;T0表11 - 4列出了非规范方式下的四种不同情形。51Testing软件测试网.b2]M7r P6a

51Testing软件测试网h(n%i'o:c2N

11.12 终端的窗口大小51Testing软件测试网/M7Oa;cgS aW
可以对当前终端窗口的大小进行跟踪,在窗口大小发生变化时,使内核通知前台进程组。内核为每个终端和伪终端保存一个 winsize结构。
9MUzZ$i0提供这种功能的目的是,当窗口大小发生变化时通知应用程序(例如vi编辑程序)。应用程序接到此信号后,它可以取得窗口大小的新值,然后重绘屏幕。51Testing软件测试网g:}f0|#wcD

51Testing软件测试网]TJ4E,y

11.13 termcap, terminfo和 curses51Testing软件测试网7s^1lf}*D
termcap的意思是终端性能(terminal capability),为了支持vi编辑器而发展起来的。termcap这种技术不是很完善的。导致开发另一种新技术—terminfo及与其相关的curses库。
-C4Nl"w,WLERh0termcap和terminfo都致力于本章所述及的问题—更改终端的方式、更改终端特殊字符、处理窗口大小等等。它们所提供的是在各种终端上执行典型操作(清屏、移动光标)的方法。
rgzK`!Qs0

8n.}!q%vh#C-c0

TAG:

 

评分:0

我来说两句

Open Toolbar