终端那些事
终端驱动属于对特定设备编写的程序。
1、软件工具和对特定设备编写的程序
所谓软件工具,就是日常用到的ls、who、grep等不区分磁盘文件和设备文件的应用程序。
软件工具用于对输入数据处理,获得输出。
这一流程和三个词密切相关——标准输入、标准输出和标准错误输出
软件工具对数据来源和目的地不做任何假设,只是处理输入获得输出
而针对特定设备编写的程序,会根据设备的特性处理一些独有的概念,
这不同于软件工具对数据去留不加注意的特性。
终端的规范处理
- 一般使用的终端显示设备会回显我们的输入,支持对输入的编辑。终端这样工作模式,称为终端的规范模式。
回显就是把输入显示在屏幕上,而要实现编辑输入,就需要对输入进行缓存。
终端的这些功能都能通过终端驱动进行设置。
命令stty和系统调用tcsetattr()提供了修改接口。
对应的,缓冲和回显被关闭的模式,称为终端的非规范模式。
而在终端处于存在感更低的raw模式时,输入数据不加处理被直接送给程序。
从这个角度看,终端驱动可以被理解成输入数据的预处理器。
看似多余的模式
- 上述几个模式似乎没有必要(何必要削减丰富的功能呢?)
事实上他们却十分常用。
a、即时响应
- 有时我们不需要编辑输入,而希望输入立即得到程序响应。例如在游戏控制时希望确定的按键获得确定的响应,就可以关闭终端的缓存,直接将数据送至对应处理程序,终端的非规范模式就派上用场。
b、无回显
- 不是所有的输入都希望被人看到。例如可以关闭输入密码时的回显,保护密码安全
c、无阻塞
- 某些命令/函数阻塞进程等待输入(比如getchar),但我们不希望没有输入计算姬就一直等待下去,就像打电话不是要一直等到对方接听。这时无阻塞模式就很有意义了。
无阻塞模式是说,即使没有获得输入,也退出,就像去餐厅吃饭,没座位吃就退出来换个地方吃,不会一直等下去。
另外,无阻塞模式配合时间变量就能实现类似“等一会”的功能。