Posix支持阻塞和非阻塞文件描述符。第二个可以用O_NONBLOCK标志打开。我的应用程序中有一个主循环,它轮询POLLIN和POLLOUT事件的一些文件描述符集(poll sys调用)。我是否仍然可以使用阻塞文件描述符,因为我只在设置了POLLOUT时写入,在设置了POLLIN时只读?
发布于 2017-04-30 21:39:14
根据poll(2)手册页:
POLLOUT写入现在是可能的,尽管写入的空间大于套接字或管道中的可用空间,但仍会阻塞(除非设置了O_NONBLOCK )。
换句话说:如果与此fd相关的内核缓冲区中没有足够的空间,则写入大于缓冲区中可用空间的数据块将会阻塞。如果有可用的空间,它们的行为是相同的。
因此,您必须将所有文件描述符设置为非阻塞,尤其是TCP套接字,因为如果另一端的进程具有慢速连接,您可能会面临阻塞写入调用,直到客户端不会将每个IP包的所有ACK发回给您。
https://stackoverflow.com/questions/43707038
复制相似问题