《unix环境高级编程》通读学习笔记(三)(第11章)
上一篇 / 下一篇 2007-07-28 17:12:59 / 个人分类:unix环境高级编程的学习记录
第11章 终端I/O
Kn PQ)Z-nS0
'Z3t Fx&jCS6Q5r011.1 引言
(Ku xep8G0终端I/O的用途很广泛,包括:终端、计算机之间的直接连接、调制解调器、打印机等等,所以它就变得非常复杂。51Testing软件测试网{6qH.J5V Y,pZ
3nq3E!d@[5m011.2 综述51Testing软件测试网
B)Wy#S!n l)Uqj6w2R
终端I/O有两种不同的工作方式:51Testing软件测试网&_(q y%?,P3_h
(1) 规范方式输入处理。在这种方式中,终端输入以行为单位进行处理。对于每个读要求,终端驱动程序最多返回一行。
0slb1l
qn0(2) 非规范方式输入处理。输入字符不以行为单位进行装配。51Testing软件测试网,D
{4h"__]
o6k
如果不作特殊处理,则默认方式是规范方式。51Testing软件测试网$oBGn5S"T
终端设备是由一般位于内核中的终端驱动程序所控制的。每个终端设备有一个输入队列,一个输出队列。
-Z{C^*e;Vl0图11-1 终端设备的输入、输出队列的逻辑结构51Testing软件测试网
MU f xuxT:R
大多数UNIX系统在一个称为终端行规程(terminal lined iscipline)的模块中进行规范处理。它是位于内核类属读、写函数和实际设备驱动程序之间的模块。51Testing软件测试网1sn L/|4Z O
图11-2 终端行规程
a{b'G&bzG0我们可以检测和更改的终端设备特性都包含在termios结构中。该结构在头文件<termios.h>中定义。
#@fs,Y0y0表11 - 1列出了所有可以更改以影响终端设备特性的终端标志。
Z\ub~U0表11 - 2列出了POSIX.1所定义的对终端设备进行操作的各个函数。51Testing软件测试网l)av6tE5H Bk
11.3 特殊输入字符
(rFNceZ3bj3B0jQ0表11-3 终端在输入时作特殊处理的字符。
N0P6Lo2e0在POSIX.1的11个特殊字符中,可将其中9个更改为几乎任何值。可选地允许禁止使用这些字符。
11.4 获得和设置终端属性51Testing软件测试网:o~6vL2N*B
使用函数tcgetattr和tcsetattr可以获得或设置termios。这样也就可以检测和修改各种终端选择标志和特殊字符,以使终端按我们所希望的方式进行操作。
j4{Bn6UA!?l0——————————————————————————————————————————————
-d4W.z#p.YBqL(|L0#include <termios.h>
|&Z,I8o
sQcD-q X0int tcgetattr(int filedes, struct termios *termptr);
e
{Lf:`[(p0int tcsetattr(int filedes, int opt, const struct termios *termptr);51Testing软件测试网w$_5kR%?[
两个函数返回:若成功则为0,若出错则为-151Testing软件测试网ZJpz,^{sz,K
——————————————————————————————————————————————
11.5 终端选择标志51Testing软件测试网C7?.t)BV5Z&O
11.6 stty命令51Testing软件测试网mi dt]-O,I;]
上节说明的所有选择项,在程序中都可用tcgetattr和tcsetattr函数(见11.4节)进行检查和更改。在命令行中则用stty(1)命令进行检查和更改。stty(1)命令是表11-2中所列的头6个函数的界面。如果以-a选择项执行此命令,则显示终端的所有选择项51Testing软件测试网0@ U hh+\*LR(B7q
11.7 波特率函数
\msRDEf0波特率(baud rate)是一个历史沿用的术语,现在它指的是“位 /每秒”。虽然大多数终端设备对输入和输出使用同一波特率,但是只要硬件许可,可以将它们设置为两个不同值。51Testing软件测试网q6EyDbvj&s*t
—————————————————————————————————————
z*[,h
P#\ q0e3{0#include <termios.h>
s@B.r^Wr0speed_t cfgetispeed(const struct termios *termptr);
`*R$}/A8nv!B0speed_t cfgetospeed(const struct termios *termptr);
-qH,}6wDV0两个函数返回:波特率值
-k/_Y:[ ]0int cfsetispeed(struct termios *termptr,speed_t speed);
R2htZw
UH0`0int cfsetospeed(struct termios *termptr,speed_t speed);
&J[D4JgR0两个函数返回:若成功为0,出错为-1。
*mIi,XR)|4`.@0—————————————————————————————————————
ak;Z9}dO8h)]011.8 行控制函数
!kAn)t0ir0下列四个函数提供了终端设备的行控制能力。51Testing软件测试网tU4o&z
dV]Ju
——————————————————————————————————————
n:C3|9~i qzf8LaS0#include <termios.h>
^ @Cb:H\,T0int tcdrain(int filedes) ;51Testing软件测试网q
L)q7CE Bw7]*l7T
int tcflow(int filedes, int action);51Testing软件测试网4r!O-hS2D(X1x"_
int tcflush(int filedes, int queue);51Testing软件测试网(T ]zu
i7w*x^k;G+^
int tcsendbreak(int filedes, int duration);
2q8uP-[ba:YKp0四个函数返回:若成功则为0,若出错则为-151Testing软件测试网 Sh[*QXe*b
——————————————————————————————————————
"gv8? L9q1eD{0tcdrain函数等待所有输出都被发送。tcflow用于对输入和输出流控制进行控制。
&YaG`4M0tcflush函数刷清(抛弃)输入缓存(终端驱动程序已接收到,但用户程序尚未读)或输出缓存(用户程序已经写,但尚未发送)。51Testing软件测试网]J5Y S+~w$fD
tcsendbreak函数在一个指定的时间区间内发送连续的 0位流。
GEM!M:X(P2L+hq011.9 终端标识51Testing软件测试网Im-qiVi6G%p
在大多数UNIX系统中,控制终端的名字是/dev/tty。POSIX.1提供了一个运行时函数,可被调用来决定控制终端的名字。
v9M?8L,y7TuGRa+B0--------------------------------------------------------------------
umM3w-h)JL*T0#include <stdio.h>
O\#[9xBPe0char * ctermid(char *ptr) ;51Testing软件测试网7m#l/IH$l
返回:见下
a#AlT.PVX0--------------------------------------------------------------------