Key-word: stty,tcgetattr, tcsetattr, fcntl, signal, 终端驱动程序的模式、阻塞/非阻塞输入
一、内容概要
Chapter 6的内容是chapter 5内容的应用和扩展。
用到的chapter 5的内容包括:
1)使用stty命令设置终端驱动程序的属性:将终端设置为规范/非规范模式;
2)使用tcgetattr, tcsetattr函数设置终端驱动程序的属性:将终端设置为规范/非规范模式、关闭回显;
3)使用fcntl函数设置终端驱动程序的属性:将终端设置为阻塞/非阻塞输入;
(注:由chapter 5的内容知,fcntl通常用来设置磁盘文件的属性,tcsetattr才是用来设置终端设备的属性的。此处可以用tcsetattr函数实现,但是用fcntl实现更为简单)。
扩展的内容包括:signal的含义和应用。
二、重要概念:
1)规范模式:驱动程序输入的字符保存在缓冲区,并且仅在收到回车键时才将这些缓冲的字符发送到程序。
2)非规范模式:当缓冲和编辑功能被关闭时。(编辑功能指:如用Backspace删除输入的字符的功能;此模式下,在终端输入字符时,无需Enter,字符当即被发送到程序)。
3)阻塞输入:当调用getchar或read从文件描述符读取输入时,程序阻塞,直到能获得某些字符或是检测到了文件的末尾。
4)非阻塞输入:当调用getchar或read从文件描述符读取输入时,直接从缓冲区读数据,无论缓冲区有无数据,都接着往下执行。 (通常需要和延时函数sleep一起使用) 。
三、内容组织顺序
本章通过编写play_again来讲解以上内容。Play_again的功能:向用户提出yes/no的问题,如是否再来一局。
先后使用了‘一’中列出的知识点来不断完善该程序的功能。
四、signal
1、
信号是由单个词组成的消息。每个信号都有一个数字编码。
2、信号来自3个地方:
1)用户。如用户输入:Ctrl-C。
2)内核。当进程执行出错时,内核给进程发送一个信号。
3)进程。指两个进程间的通信。
3、如何处理信号
通过调用signal函数实现对信号的处理,通常的处理方法有一下三种:
1)接受默认处理(通常是kill掉接收这个信号的进程)
2)忽略信号
3)调用一个函数
当是第三种情况时,非常类似于对中断的处理(中断也是一种信号),中断可以触发设定的函数。
函数原型:result = signal( int signum, void (* action) (int) )