Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3354561
  • 博文数量: 1450
  • 博客积分: 11163
  • 博客等级: 上将
  • 技术积分: 11101
  • 用 户 组: 普通用户
  • 注册时间: 2005-07-25 14:40
文章分类

全部博文(1450)

文章存档

2017年(5)

2014年(2)

2013年(3)

2012年(35)

2011年(39)

2010年(88)

2009年(395)

2008年(382)

2007年(241)

2006年(246)

2005年(14)

分类: LINUX

2007-10-11 14:16:27

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

11.2 综述
终端I/O有两种不同的方式:
(1) 规范方式输入处理。在这种方式中,终端输入以行为单位进行处理。对于每个读要求,终端驱动程序最多返回一行。
(2) 非规范方式输入处理。输入字符不以行为单位进行装配。
如果不作特殊处理,则默认方式是规范方式。
终端设备是由一般位于内核中的终端驱动程序所控制的。每个终端设备有一个输入队列,一个输出队列。
图11-1   终端设备的输入、输出队列的逻辑结构
大多数UNIX系统在一个称为终端行规程(terminal lined iscipline)的模块中进行规范处理。它是位于内核类属读、写函数和实际设备驱动程序之间的模块。
图11-2   终端行规程
我们可以检测和更改的终端设备特性都包含在termios结构中。该结构在头文件中定义。
表11 - 1列出了所有可以更改以影响终端设备特性的终端标志。
表11 - 2列出了POSIX.1所定义的对终端设备进行操作的各个函数。

11.3 特殊输入字符
表11-3 终端在输入时作特殊处理的字符。
在POSIX.1的11个特殊字符中,可将其中9个更改为几乎任何值。可选地允许禁止使用这些字符。

11.4 获得和设置终端属性
使用函数tcgetattr和tcsetattr可以获得或设置termios。这样也就可以检测和修改各种终端选择标志和特殊字符,以使终端按我们所希望的方式进行操作。
——————————————————————————————————————————————
#include
int tcgetattr(int filedes, struct termios *termptr);
int tcsetattr(int filedes, int opt, const struct termios *termptr);
两个函数返回:若成功则为0,若出错则为-1
——————————————————————————————————————————————

11.5 终端选择标志
11.6 stty命令

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

11.7 波特率函数
波特率(baud rate)是一个历史沿用的术语,现在它指的是“位 /每秒”。虽然大多数终端设备对输入和输出使用同一波特率,但是只要硬件许可,可以将它们设置为两个不同值。
—————————————————————————————————————
#include
speed_t cfgetispeed(const struct termios *termptr);
speed_t cfgetospeed(const struct termios *termptr);
两个函数返回:波特率值
int cfsetispeed(struct termios *termptr,speed_t speed);
int cfsetospeed(struct termios *termptr,speed_t speed);
两个函数返回:若成功为0,出错为-1。
—————————————————————————————————————

11.8 行控制函数
下列四个函数提供了终端设备的行控制能力。
——————————————————————————————————————
#include
int tcdrain(int filedes) ;
int tcflow(int filedes, int action);
int tcflush(int filedes, int queue);
int tcsendbreak(int filedes, int duration);
四个函数返回:若成功则为0,若出错则为-1
——————————————————————————————————————
tcdrain函数等待所有输出都被发送。tcflow用于对输入和输出流控制进行控制。
tcflush函数刷清(抛弃)输入缓存(终端驱动程序已接收到,但用户程序尚未读)或输出缓存(用户程序已经写,但尚未发送)。
tcsendbreak函数在一个指定的时间区间内发送连续的 0位流。

11.9 终端标识
在大多数UNIX系统中,控制终端的名字是/dev/tty。POSIX.1提供了一个运行时函数,可被调用来决定控制终端的名字。
--------------------------------------------------------------------
#include
char * ctermid(char *ptr) ;
返回:见下
--------------------------------------------------------------------
此函数的主要作用是帮助提高向的可移植性。

11.10 规范方式
规范方式很简单—发一个读请求,当一行已经输入后,终端驱动程序即返回。许多条件造成读返回。
1.所要求的字节数已读到时读即返回。
2.当读到一个行定界符时,读返回。
3.如果捕捉到信号而且该函数并不自动再起动(见10.5节),则读也返回。

11.11 非规范方式
将termios结构中c_lflag字段的ICANON标志关闭就使终端处于非规范方式。
当已读了指定量的数据后,或者已经过了给定量的时间后,即通知系统返回。这种使用了termios结构中c_cc数组的两个变量:MIN和TIME。
MIN说明一个read返回前的最小字节数。TIME说明等待数据到达的分秒数。
表11 - 4列出了非规范方式下的四种不同情形。

11.12 终端的窗口大小
可以对当前终端窗口的大小进行跟踪,在窗口大小发生变化时,使内核通知前台进程组。内核为每个终端和伪终端保存一个 winsize结构。
提供这种功能的目的是,当窗口大小发生变化时通知应用程序(例如vi编辑程序)。应用程序接到此信号后,它可以取得窗口大小的新值,然后重绘屏幕。

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

阅读(938) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~