IO复用是否需要使用非阻塞文件描述符?

yan*_*pas 4 c unix io posix network-programming

Posix 支持阻塞和非阻塞文件描述符。第二个可以用标志打开O_NONBLOCK。我的应用程序中有一个主循环,它轮询一些poll文件描述符集(系统调用)POLLINPOLLOUT事件。我是否仍可以使用阻塞文件描述符,因为我仅在POLLOUT设置时写入并仅在POLLIN设置时读取?

yan*_*pas 5

根据 poll(2) 手册页:

现在可以进行POLLOUT写入,但大于套接字或管道中可用空间的写入仍会阻塞(除非设置了 O_NONBLOCK)。

换句话说:如果内核缓冲区中没有足够的空间与该 fd 关联,则写入大于缓冲区中可用空间的数据块将会阻塞。如果有可用空间,它们的行为相同。

因此,您必须将所有文件描述符设置为非阻塞,尤其是 TCP 套接字,因为如果另一端的进程连接速度较慢,您可能会面临阻塞写入调用,直到客户端不会向您发送回每个 IP 包的所有 ACK 。

  • @R.. 哇,考虑到该邮件列表线程中的讨论基调,这真是令人惊讶。但我想13年可以改变一切。 (3认同)