【问题标题】:Blocking recv() vs fcntl()阻塞 recv() 与 fcntl()
【发布时间】:2016-05-02 15:12:17
【问题描述】:

我使用recv() 从套接字读取数据并使用fcntl() 设置套接字阻塞/非阻塞。我的问题是:如果我调用recv()(阻塞)并且我从另一个线程调用fcntl()并将套接字设置为非阻塞,那么当前运行的recv()会返回还是fcntl()的效果只会在之后发生阻塞的recv() 返回了,我又调用它了吗?

【问题讨论】:

  • 试试看。奇怪的是,您希望一个套接字既是阻塞的又是非阻塞的,并且让另一个线程对状态进行欺骗。在 linux 上,我会在客户端使用 socket() 和服务器上的 accept4() 设置创建套接字时为非阻塞。
  • 您是否只是想异步唤醒在recv 调用中阻塞的线程?如果是这样,即使fcntl 产生所需的结果,也可能有更好/更安全的方法。例如,使用poll 阻塞外部recv 套接字仅用于进程内通知的内部套接字。
  • @BrianMcFarland 这正是我打算做的,但由于它甚至不起作用(根据 EJP 的回答),我会研究你的想法。谢谢!
  • 最简单的解决方案是调用poll(或selectepoll_wait)超时,然后检查由其他线程设置的标志。显然,当您不需要唤醒时,会浪费一些 CPU 周期。除此之外,请尝试使用eventfdpipesocketpair,按照灵活性从低到高的顺序依次是资源开销。

标签: c linux sockets posix


【解决方案1】:

不会影响当前的接收操作。

奇怪的事情。

【讨论】:

  • 感谢您的回答!我想用这种方法唤醒阻塞线程,但我想我会考虑其他选项。
  • @BertalanRadostyan: "我想唤醒阻塞线程" 只需向线程发送信号(确保 SA_RESTART 不是信号处理程序)。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-18
  • 1970-01-01
  • 2017-07-30
  • 1970-01-01
相关资源
最近更新 更多