【问题标题】:Linux socket - set non blocking using O_NONBLOCKLinux 套接字 - 使用 O_NONBLOCK 设置非阻塞
【发布时间】:2021-09-03 10:39:30
【问题描述】:

如果我使用fcntl(sockfd, F_SETFL, O_NONBLOCK); 使 TCP 套接字描述符成为非阻塞式,那么这是否会使所有后续套接字 API 像 read()/listen()/accept()/ etc.. 一样也非阻塞式?

【问题讨论】:

  • 使这些套接字 API 调用非阻塞正是 O_NONBLOCK 的重点。你认为 O_NONBLOCK 还做了什么?
  • @user207421 ,@Steffen Ullrich 谢谢。好吧,我想知道我什么时候看到了一个执行 O_NONBLOCK 并后来使用recv(sd, buffer, size, MSG_DONTWAIT) 的代码。如果程序员试图解决一些极端情况,我想到了这个问题。
  • 假设他使用的是“带大括号”的方法 ;-) MSG_DONTWAIT 适用于您没有设置 O_NONBLOCK 和你只想要一个非阻塞的 `recv() 单独。坦率地说,很难看出这一点,我已经 40 年没用过了。

标签: sockets network-programming ipc


【解决方案1】:

手册页中有官方答案,特别是socket(7)

通过使用 fcntl(2) 在套接字文件描述符上设置 O_NONBLOCK 标志,可以在套接字上执行非阻塞 I/O。然后所有会阻塞的操作将(通常)以 EAGAIN 返回(操作应稍后重试); connect(2) 将返回 EINPROGRESS 错误。然后用户可以通过 poll(2) 或 select(2) 等待各种事件。

所以是的,设置 O_NONBLOCK 将导致阻塞操作返回 EAGAIN/EINPROGRESS 而不是阻塞。

【讨论】:

    猜你喜欢
    • 2013-06-03
    • 2013-07-20
    • 1970-01-01
    • 2010-10-31
    • 2013-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    相关资源
    最近更新 更多