yan*_*pas 4 c unix io posix network-programming
Posix 支持阻塞和非阻塞文件描述符。第二个可以用标志打开O_NONBLOCK。我的应用程序中有一个主循环,它轮询一些poll文件描述符集(系统调用)POLLIN和POLLOUT事件。我是否仍可以使用阻塞文件描述符,因为我仅在POLLOUT设置时写入并仅在POLLIN设置时读取?
根据 poll(2) 手册页:
现在可以进行POLLOUT写入,但大于套接字或管道中可用空间的写入仍会阻塞(除非设置了 O_NONBLOCK)。
换句话说:如果内核缓冲区中没有足够的空间与该 fd 关联,则写入大于缓冲区中可用空间的数据块将会阻塞。如果有可用空间,它们的行为相同。
因此,您必须将所有文件描述符设置为非阻塞,尤其是 TCP 套接字,因为如果另一端的进程连接速度较慢,您可能会面临阻塞写入调用,直到客户端不会向您发送回每个 IP 包的所有 ACK 。