文章目录
概述
在第5章中,我们看到TCP客户端同时处理两个输入:标准输入和TCP套接字。我们遇到的问题就是在客户端阻塞于(标准输入上的)fgets调用期间,服务器进程会被杀死。服务器虽然正确地给客户TCP发送了一个FIN,但是客户进程阻塞于从标准输入读入的过程,它将看不到这个EOF,直到从套接字读时为止。这样进程就需要一种预先告知内核的能力,使得内核一旦发现进程指定的一个或多个I/O就绪(也就是说输入已准备好被读取,或者描述符已能承接更多的输出),它就通知进程。这个能力称为 I/O复用。
I/O复用场合:
- 客户处理多个描述符(通常是交互式输入和网络套接字)
- 客户同时处理多个套接字
- TCP服务器纪要处理监听套接字,又要处理已连接套接字
- 服务器既要处理TCP,又要处理UDP
- 服务器要处理多个服务或者多个协议
I/O模型
- 阻塞式I/O
- 非阻塞式I/O
- I/O复用(select和poll)
- 信号驱动式I/O(SIGIO)
- 异步I/O(POSIX