终端I/O之综述
终端I/O有两种不同的工作模式:
- 规范模式输入处理(Canonical mode input processing)。在这种模式中,终端输入以行为单位进行处理。对于每个读要求,终端驱动程序最多返回一行。
- 非规范模式输入处理(Noncanonical mode input processing)。输入字符并不组成行。
如果不作特殊处理,则默认模式是规范模式。
V7和较早的BSD风格类的终端驱动程序支持三种终端输入模式:(a)精细加工模式(输入组成行,并对特殊字符进行处理);(b)原始模式(输入不组成行,也不对特殊字符进行处理);(c)cbreak模式(输入不组成行,但对某些特殊字符进行处理)。
终端设备是由一般位于内核中的终端驱动程序控制的。每个终端设备有一个输入队列和一个输出队列,如图18-1所示。

图18-1 终端设备的输入、输出队列逻辑结构
将图18-1转换为如下图所示更容易理解:

对此图要说明以下几点:
- 如果打开了回显功能,则在输入队列和输出队列之间有一个隐含的连接。
- 输入队列的长度MAX_INPUT是有限值,当一个特定设备的输入队列已经填满时,系统对此作何种处理依赖于实现。大多数UNIX系统的处理方式是回显响铃字符。
- 图中没有显示另一个输入限制MAX_CANON,它是一个规范模式输入行中的最大字节数。
- 虽然输出队列通常也是有限长度,但是程序并不能获得这个定义其长度的常量,这是因为当输出队列将要填满时,内核使写进程休眠直至写队列中有可用的空间,所以程序无需关心该队列的长度。
- 我们可以使用tcflush函数刷清(flush)输入或输出队列。
大多数UNIX系统在一个称为终端行规程(terminal line discipline)的模块中进行规范处理。它是位于内核通用读、写函数和实际设备驱动程序之间的模块(见图18-2)。

图18-2 终端行规程
所有我们可以检测和更改的终端设备特性都包含在termios结构中。该结构定义在头文件<termios.h>中。
struct termios {
tcflag_t c_iflag; /* input flags */
tcflag_t c_oflag; /* output flags */
tcflag_t c_cflag; /* control flags */
tcflag_t c_lflag; /* local flags */
cc_t c_cc[NCCS]; /* control characters */
};
粗略而言,输入标志由终端设备驱动程序用来控制字符的输入(剥除输入字节的第8位,允许输入奇偶校验等等),输出标志则控制驱动程序输出(执行输出处理、将换行符映射为CR/LF等),控制标志影响到RS-32串行线(忽略调制解调器的状态线、每个字符的一个或两个停止位等等),本地标志影响驱动程序和用户之间的接口(回送的开或关、可视的擦除字符、终端产生的信号启用以及对后台输出的作业控制停止信号等)。
类型tcflag_t的长度足以保存每个标志值。它经常被定义为unsigned int或者unsigned long。c_cc数组包含了所有可以更改的特殊字符。NCCS是该数组的长度,一般介于15-20之间(大多数UNIX系统定义的特殊字符较POSIX所定义的11个要多)。cc_t类型的长度足以保存每个特殊字符,而且它往往是unsigned char型的。
表18-1至表18-4列出了所有可以进行更改以影响终端设备特性的终端标志。注意,虽然Single UNIX Specification定义了所有平台都支持的公共子集,但是各平台还有自己的扩充部分。
表18-1 c_cflag终端标志

表18-2 c_iflag终端标志

表18-3 c_lflag终端标志

表18-4 c_oflag终端标志

表18-5列出了Single UNIX Specification所定义的对终端设备进行操作(检测和更改终端设备的特性)的的各个函数。http://www.cnblogs.com/nufangrensheng/p/3513642.html中已说明了 tcgetpgrp、tcgetsid和tcsetpgrp函数。)
表18-5 终端I/O函数总览

注意,对终端设备,Single UNIX Specification没有使用经典的ioctl,而使用了表18-5中列出的13个函数。这样做的理由是:对于终端设备的ioctl函数,其最后一个参数的数据类型随执行动作的不同而不同。于是,这使得对参数进行类型检查成为不可能。
虽然对终端设备进行操作只有13个函数,但是表18-5中头两个函数(tcgetattr和tcsetattr)能处理大约70中不同的标志(见表18-至表18-4)。此外,对于终端设备有大量的选项可供使用,对一个特定设备(终端、调制解调器、激光打印机等等)还要决定所需的选项,这些都使对终端设备的处理变得异常复杂。
表18-5中列出的13个函数之间的关系如图18-3所示:

图18-3 与终端有关的函数之间的关系
终端I/O之综述的更多相关文章
- 工业物联网或系统集成中应用消息队列(ActiveMQ,C#的demo)的场景全面分析
1.[连载]<C#通讯(串口和网络)框架的设计与实现> 2.[开源]C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 2.应用SuperIO(SIO)和开源跨平台物联网框 ...
- Python爬虫入门一之综述
大家好哈,最近博主在学习Python,学习期间也遇到一些问题,获得了一些经验,在此将自己的学习系统地整理下来,如果大家有兴趣学习爬虫的话,可以将这些文章作为参考,也欢迎大家一共分享学习经验. Pyth ...
- APUE读书笔记-第18章-终端I/O
18.1 引言 *终端I/O的用途很广泛,包括用于终端.计算机之间的直接连线.调制解调器以及打印机等等,所以终端I/O系统非常复杂 18.2 综述 *终端I/O有两种不同的工作模式: (1)规范模式输 ...
- Linux kernel的中断子系统之(一):综述
返回目录:<ARM-Linux中断系统>. 总结: 一从作为一名驱动工程师角度看,用好中断需要正确认识request_threaded_irq/request_irq关系.中断临界区保护. ...
- Network Monitoring in Software-Defined Networking :A Review(综述)
来源:IEEE SYSTEMS JOURNAL 发表时间:2018 类型:综述 主要内容:概述了SDN监控的发展,并从收集信息.预处理.传送信息.分析.和描述五个阶段进行解读,并比较了传统网络和SDN ...
- 终端IO(上)
一.综述 终端IO有两种不同的工作方式: 规范方式输入处理.在这种方式中,终端输入以行为单位进行处理.对于每个读要求,终端驱动程序最多返回一行. 非规范方式输入处理.输入字符不以行为单位进行装配 如果 ...
- 1.Python爬虫入门一之综述
要学习Python爬虫,我们要学习的共有以下几点: Python基础知识 Python中urllib和urllib2库的用法 Python正则表达式 Python爬虫框架Scrapy Python爬虫 ...
- Unix环境高级编程(二十)伪终端
1.综述 伪终端对于一个应用程序而言,看上去像一个终端,但事实上伪终端并不是一个真正的终端.从内核角度看,伪终端看起来像一个双向管道,而事实上Solaris的伪终端就是用STREAMS构建的.伪终端总 ...
- 转 Python爬虫入门一之综述
转自: http://cuiqingcai.com/927.html 静觅 » Python爬虫入门一之综述 首先爬虫是什么? 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为 ...
随机推荐
- 【Python学习笔记】字符串操作
字符串的表示 python中的字符串是一个常量,可以使用单引号'',双引号""或三引号""" """来创建一个字符串常量 ...
- dedecms list 判断 每隔3次输出内容
{dede:list pagesize='12' runphp='yes'} [field:global name=autoindex runphp="yes"](@me%3==0 ...
- Flex之HTTPService组件调用
1.采用<s:HTTPService>标签来实现: <?xml version="1.0" encoding="utf-8"?>< ...
- bzoj2940: [Poi2000]条纹
2940: [Poi2000]条纹 条纹游戏是一个双人的游戏.所需要的物品有一个棋盘以及三种颜色的长方形条纹,这三种颜色分别是红色.绿色和蓝色.所有的红色条纹的尺寸是c*1,所有的绿色条纹的尺寸是z* ...
- home-brew 安装&下载
安装: ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)&qu ...
- ajax 新闻栏目
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 提升c++builder 代码输入流畅度的配置
提高c++builder 代码输入流畅度 1.输入指针的函数名后,识别函数参数移动光标到括弧内,此功能太慢,有明显延迟,建议关闭.关闭以后,输入函数名不会自动添加(),需要自己手动输入括弧了,不过速度 ...
- 转】Maven学习总结(九)——使用Nexus搭建Maven私服
原博文出自于:http://www.cnblogs.com/xdp-gacl/p/4068967.html 感谢! 一.搭建nexus私服的目的 为什么要搭建nexus私服,原因很简单,有些公司都不提 ...
- WebRTC源码分析:音频模块结构分析
一.概要介绍WebRTC的音频处理流程,见下图: webRTC将音频会话抽象为一个通道Channel,譬如A与B进行音频通话,则A需要建立一个Channel与B进行音频数据传输.上图中有三个Chann ...
- 结合windows消息系统理解C#中WndProc函数和DefWndProc函数
Windows消息系统由3部分组成: 1.消息队列.Windows应用程序的消息是由Windows统一在一个消息队列中管理的. 2.消息循环.应用程序从Windows消息队列中获得自己 ...