是否有必要将非阻塞文件描述符与IO多路复用一起使用?

时间:2017-04-30 13:39:14

标签: c unix io network-programming posix

Posix支持阻止​​和非blcoking文件描述符。可以使用O_NONBLOCK标志打开第二个。我的应用程序中有一个主循环,它会轮询pollPOLLIN个事件的文件描述符集(POLLOUT sys调用)。我是否仍然可以使用阻止文件描述符,因为我只在POLLOUT设置时才写,只在设置POLLIN时才读取?

1 个答案:

答案 0 :(得分:3)

正在轮询(2)手册页:

  

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

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

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