终端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社区中间,更经常的称为 ...
随机推荐
- c# webbrowser获取滚动条最大值
int HeightMax = 0; int WidthMax =0; HeightMax = webBrowser1.Document.Body.ScrollRectangle.Height-web ...
- How to install php evn on ubuntu
1. How to install PHP EVN 打开终端,也就是命令提示符. 我们先来最小化组建安装,按照自己的需求一步一步装其他扩展.命令提示符输入如下命令: 1 sudo apt-get in ...
- Intel XDK问题
1.不能加入AndroidManifest.xml或者info.plist文件,没法设置特定信息,例如强制横屏. 2.不能自定义图表和启动loading界面
- ubuntu LVM
本文介绍下,在ubuntu中扩展LVM磁盘的具体方法,有需要的朋友参考下吧. 当LV空间利用率较大即将耗尽LV空间时,可以将一块新的磁盘或一块磁盘上的/空间加入LV中. 现在/ 空间如下: 代码示例: ...
- Hadoop概念学习系列之常见的分布式文件系统(二十六)
常见的分布式文件系统有,GFS.HDFS.Lustre .Ceph .GridFS .mogileFS.TFS.FastDFS等.各自适用于不同的领域.它们都不是系统级的分布式文件系统,而是应用级的分 ...
- 【MySql】权限不足导致的无法连接到数据库以及权限的授予和撤销
[环境参数] 1.Host OS:Win7 64bit 2.Host IP:192.168.10.1 3.VM: VMware 11.1.0 4.Client OS:CentOS 6 5.Client ...
- Working with Other Node Types II
[Working with Other Node Types II] An SKCropNode object does not directly render content, like a spr ...
- jy
222 DROP TABLE t_vhl_jy_car; CREATE TABLE t_vhl_jy_car( VEHICLE_JY_CODE ) PRIMARY KEY, VEHICLE_CODE ...
- Python下调用Linux的Shell命令
有时候难免需要直接调用Shell命令来完成一些比较简单的操作,比如mount一个文件系统之类的.那么我们使用Python如何调用Linux的Shell命令?下面来介绍几种常用的方法: 1. os 模块 ...
- HDU 5443 The Water Problem (水题,暴力)
题意:给定 n 个数,然后有 q 个询问,问你每个区间的最大值. 析:数据很小,直接暴力即可,不会超时,也可以用RMQ算法. 代码如下: #include <cstdio> #includ ...