Linux套接字 - 使用O_NONBLOCK设置非阻塞

3

如果我使用fcntl(sockfd, F_SETFL, O_NONBLOCK);将TCP套接字描述符设置为非阻塞的,那么所有后续的套接字API(如read()/listen()/accept()/等等..)也是非阻塞的吗?


3
将这些套接字 API 调用设置为非阻塞正是 O_NONBLOCK 的目的,您还假设 O_NONBLOCK 还有什么其他作用? - Steffen Ullrich
@user207421,@Steffen Ullrich 谢谢。我看到一段代码使用了O_NONBLOCK,然后又使用了recv(sd, buffer, size, MSG_DONTWAIT)。我在想,这个程序员是不是在处理一些边缘情况。 - Franc
1
我们可以说他采用了一种“双重保险”的方法;-) MSG_DONTWAIT 适用于当您没有设置 O_NONBLOCK,但您仍希望在该 recv() 中进行非阻塞操作。坦率地说,很难看出其意义,我在40年的编程生涯中从未使用过它。 - user207421
1个回答

2
在man页面中有一个官方答案,具体来说是socket(7)
可以通过使用fcntl(2)在套接字文件描述符上设置O_NONBLOCK标志来对套接字进行非阻塞I/O。然后,所有会阻塞的操作通常会返回EAGAIN(操作应稍后重试);connect(2)将返回EINPROGRESS错误。用户可以通过poll(2)或select(2)等待各种事件。
因此,是的,设置O_NONBLOCK将导致阻塞操作返回EAGAIN/EINPROGRESS而不是阻塞。

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