MyException - 我的异常网
当前位置:我的异常网» 操作系统 » 终端 I/O 综上所述

终端 I/O 综上所述

www.MyException.Cn  网友分享于:2018-05-16  浏览:0次
终端 I/O 综述
    终端设备可认为是由内核中的终端驱动程序控制的。每个终端设备都有一个输入队列和输出队列。如下图所示。

    对该图要说明以下几点:
    1)如果打开了回显功能,则在输入队列和输出队列之间有个隐含的连接。
    2)当一个特定设备的输入队列中的字节数达到 MAX_INPUT(见unix限制一节)时,系统的行为将依赖于实现(大多数 UNIX 系统回显响铃字符)。
    3)图中没有显示另一个输入限制 MAX_CANON,它是一个规范输入行的最大字节数。
    4)虽然输出队列的长度通常也是有限的,但程序并不能获得该长度,因为内核会在输出队列将要填满时使写进程休眠,直到写队列中有可用的空间。
    5)后面会介绍如何使用 tcflush 函数冲洗输入或输出队列,以及在介绍 tcsetattr 函数时,将了解到如何通知系统只有在输出队列为空时,才能改变一个终端的属性,也可以让它在改变终端属性时丢弃输入队列中的所有东西。
    多数 UNIX 系统在一个称为终端行规程(terminal line discipline)的模块中进行全部的规范处理,可将其视作位于内核通用读、写函数和实际设备驱动程序之间的一个盒子。如图所示。

    termios 结构包含了所有可以检测和更改的终端设备特性。
#include <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
};

    其中,输入标志 c_iflag 通过终端设备驱动程序控制字符的输入(如剥除输入字节的第 8 位,允许输入奇偶校验),输出标志 c_oflag 则控制驱动程序输出(如执行输出处理、将换行符转换成 CR/LF),控制标志 c_cflag 影响 RS-232 串行线(如忽略调制解调器的状态线、每个字符的一个或两个停止位),本地标志 c_lflag 影响驱动程序和用户之间的接口(如回显打开或关闭、可视地擦除字符、允许终端产生的信号以及对后台输出的作业控制停止信号),c_cc 数组包含了所有可以更改的特殊字符。
    下面的四个图列出了所有可以更改以影响终端设备特性的终端标志。




    要检测和更改终端设备的这些特性,可以使用下图列出的用来操作终端设备的各个函数。

    其中 tcgetpgrp、tcgetsid 和 tcsetpgrp 函数在进程组、会话和控制终端一节中已经说明,其它函数会在后面介绍。注意,Single UNIX Specification 没有对终端设备使用经典的 ioctl 函数(见终端I/O函数 ioctl一节),而是使用这些函数的原因是:对于终端设备的 ioctl 函数,其最后一个参数的数据类型随执行动作的不同而改变。因此,不可能对参数进行类型检查。这些函数之间的关系如下图所示。

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有