如果我使用fcntl(sockfd, F_SETFL, O_NONBLOCK);将TCP套接字描述符设置为非阻塞的,那么所有后续的套接字API(如read()/listen()/accept()/等等..)也是非阻塞的吗?
在man页面中有一个官方答案,具体来说是socket(7):可以通过使用fcntl(2)在套接字文件描述符上设置O_NONBLOCK标志来对套接字进行非阻塞I/O。然后,所有会阻塞的操作通常会返回EAGAIN(操作应稍后重试);connect(2)将返回EINPROGRESS错误。用户可以通过poll(2)或select(2)等待各种事件。因此,是的,设置O_NONBLOCK将导致阻塞操作返回EAGAIN/EINPROGRESS而不是阻塞。
recv(sd, buffer, size, MSG_DONTWAIT)
。我在想,这个程序员是不是在处理一些边缘情况。 - FrancMSG_DONTWAIT
适用于当您没有设置O_NONBLOCK
,但您仍希望在该recv()
中进行非阻塞操作。坦率地说,很难看出其意义,我在40年的编程生涯中从未使用过它。 - user207421