使用IO多路复用时是否必须使用非阻塞文件描述符?

4

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

1个回答

5
根据poll(2)手册页面:
POLLOUT: 虽然套接字(socket)或管道(pipe)的可用空间不足时写入仍将被阻塞(除非设置了O_NONBLOCK),但现在可以进行写入。
换句话说: 如果与此fd关联的内核缓冲区中没有足够的空间,写入大于缓冲区可用空间的数据块将会被阻塞。如果有可用空间,则它们的行为是相同的。
因此,必须将所有文件描述符设置为非阻塞模式,特别是TCP套接字(socket),因为如果另一端的进程连接速度较慢,您可能会遇到阻塞写入调用,直到客户端发送回每个IP包的所有ACK。

1
在Linux中,阅读也可能成为一个问题。可以查看这个内核邮件列表线程,其中被报告为一个错误。内核开发人员表示,无论POSIX的文字阐释如何,它都不会被更改,所以您应该使用“O_NONBLOCK”。 - user2404501
@WumpusQ.Wumbley:那个漏洞最终被修复了。 - R.. GitHub STOP HELPING ICE
3
哇,这真是个惊喜,考虑到邮件列表中讨论的语气,这点让人感到意外。但我猜13年可以改变一切。 - user2404501

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接