12-何时发送IO就绪信号
63.3.1 何时发送“I/O就绪”信号
现在我们针对多种文件类型考虑何时会发送“I/O就绪”信号。
终端和伪终端
对于终端和伪终端,当产生新的输入时会生成一个信号,即使之前的输入还没有被读取也是如此。如果终端上出现文件结尾的情况,此时也会发送“输入就绪”的信号(但伪终端上不会)。
对于终端来说没有“输出就绪”的信号。当终端断开连接时也不会发出信号。
从 2.4.19 版内核开始,Linux 对伪终端的从设备端提供了“输出就绪”的信号。当伪终端主设备侧读取了输入后就会产生这个信号。
管道和FIFO
对于管道或FIFO的读端,信号会在下列情况中产生。
- 数据写入到管道中(即使已经有未读取的输入存在)。
- 管道的写端关闭。
对于管道或FIFO的写端,信号会在下列情况中产生。
- 对管道的读操作增加了管道中的空余空间大小,因此现在可以写入PIPE_BUF个字节而不被阻塞。
- 管道的读端关闭。
套接字
信号驱动I/O可适用于UNIX和Internet域下的数据报套接字。信号会在下列情况中产生。
- 一个输入数据报到达套接字(即使已经有未读取的数据报正等待读取)。
- 套接字上发生了异步错误。
信号驱动I/O可适用于UNIX和Internet域下的流式套接字。信号会在下列情况中产生。
- 监听套接字上接收到了新的连接。
- TCP connect()请求完成,也就是TCP连接的主动端进入ESTABLISHED状态,如图61-5所示。对于UNIX域套接字,类似情况下是不会发出信号的。
- 套接字上接收到了新的输入(即使已经有未读取的输入存在)。
- 套接字对端使用shutdown()关闭了写连接(半关闭),或者通过close()完全关闭。
- 套接字上输出就绪(例如套接字发送缓冲区中有了空间)。
- 套接字上发生了异步错误。
inotify文件描述符
当inotify文件描述符成为可读状态时会产生一个信号——也就是由inotify文件描述符监视的其中一个文件上有事件发生时。