- 软件工具:从文件或者stdin读取数据写到stdout
对磁盘文件和设备文件不加区分的程序称为软件工具。软件工具从标准输入读取字节,进行一些处理,然后将包含结果的字节流写到标准输出。工具发送错误消息到标准错误输出,它们也被当作简单的字节流来处理。这些文件的描述符能够连接到文件、终端、鼠标、光电管等等。工具对所处理的数据的源和目的不做任何假设。其它很多程序也能从命令行所指定的文件中读取数据。
事实上,大多数进程自动将前三个文件描述符打开,即连接到stdin,stdout以及stderror,它们不需要调用open来与这三个文件建立连接。而软件工具的输入和输出能够被重定向到任何类型的连接上。 - 特定设备程序:为特定应用控制设备 其它程序,如控制扫描仪、记录压缩盘、操作磁盘驱动程序和拍摄数码相片的程序也能同特定设备进行交互。书中通过终端与人交互的程序来探讨写这些程序时用到的概念和技术。将这些面向终端的程序称为用户程序。
- 用户程序
用户程序的例子:vi,emacs等等。这些程序设置终端驱动程序的击键和输出处理方式。驱动程序有许多设置,但是用户常用到的有- 立即响应的击键事件
- 有限的输入集
- 输入的超时
- 屏蔽Ctrl-C
终端驱动程序的模式:
先通过简短的转换程序来深入理解设备驱动程序的细节:
1 /* rotate.c 2 * purpose:useful for showing tty modes 3 * map a->b , b->c , ... , y->z ; 4 */ 5 6 #include <stdio.h> 7 #include <stdlib.h> 8 #include <ctype.h> 9 10 int main() 11 { 12 int c ; 13 while( ( c = getchar()) != EOF ) 14 { 15 if(c == 'z') 16 { 17 c = 'a'; 18 } 19 else if( islower(c)) 20 { 21 c++ ; 22 } 23 putchar(c) ; 24 } 25 return 0 ; 26 }
使用tr命令能够达到同样的效果,但是tr的GNU版本具有输入缓冲,以上是一个不带缓冲的具体例子。这个程序中,rotate程序是和终端驱动器交换数据的,而终端驱动器从键盘输入数据并且从屏幕输出数据。
规范模式:缓冲和编辑
使用默认设置运行这个程序,我们发现,缓冲、编辑、回显和控制键的处理都由终端驱动程序完成了。缓冲和编辑包含规范处理,当这些特征被启动,终端连接被成为处于规范模式。
非规范处理:
如果使用“stty -icanon”关闭了终端驱动程序的规范模式处理,则上述程序的处理方式被改变了。
特别地,非规范模式没有缓冲,输入一个字符就会立即被送到程序rotate处理并且立即回显。
终端模式小结:
- 规范模式
也成为cooked模式,是用户常见模式。驱动程序输入的字符保存在缓冲区,在接收回车键时才将这些缓冲数据发送到程序。缓冲的数据可以实现最基本的编辑、删除功能。 - 非规范模式当缓冲和编辑功能被关闭时,连接被成为非规范模式。终端处理器仍进行特定的字符处理。如果使用此模式,并且希望用户能够编辑输入,需要在用户程序中实现编辑功能。
- raw模式每个处理步骤都被一个独立的位控制。例如,ISIG的位控制Ctrl-C是否用于终止一个程序。
当所有处理都被关闭之后,驱动程序直接将输入传递给程序。在这种情况下,驱动程序被成为raw模式。