【发布时间】:2017-09-28 03:45:02
【问题描述】:
Posix 支持阻塞和非阻塞文件描述符。第二个可以用O_NONBLOCK 标志打开。我的应用程序中有一个主循环,它轮询POLLIN 和POLLOUT 事件的一些文件描述符集(poll sys 调用)。我还可以使用阻塞文件描述符吗,因为我只在设置了POLLOUT 时才写入,而只在设置了POLLIN 时才读取?
【问题讨论】:
标签: c unix io network-programming posix
Posix 支持阻塞和非阻塞文件描述符。第二个可以用O_NONBLOCK 标志打开。我的应用程序中有一个主循环,它轮询POLLIN 和POLLOUT 事件的一些文件描述符集(poll sys 调用)。我还可以使用阻塞文件描述符吗,因为我只在设置了POLLOUT 时才写入,而只在设置了POLLIN 时才读取?
【问题讨论】:
标签: c unix io network-programming posix
根据 poll(2) 手册页:
POLLOUT 现在可以进行写入了,尽管大于套接字或管道中可用空间的写入仍然会阻塞(除非设置了 O_NONBLOCK)。
换句话说:如果与此 fd 关联的内核缓冲区中没有足够的空间,则写入一块大于缓冲区中可用空间的数据块将阻塞。如果有可用空间,它们的行为相同。
因此,您必须将所有文件描述符设置为非阻塞,尤其是 TCP 套接字,因为如果另一端的进程连接速度较慢,您可能会遇到阻塞写入调用,直到客户端不会向您发送所有 ACK每个 IP 包。
【讨论】:
O_NONBLOCK。