【问题标题】:Broken pipe when socket is closed套接字关闭时管道破裂
【发布时间】:2011-07-19 23:16:42
【问题描述】:

我在 Linux 机器上有一个服务器/客户端应用程序。如果客户端尝试发送请求时服务器没有启动,我会收到一个 SIGPIPE 并且应用程序会终止。

在我尝试写入之前,如何检查服务器是否在套接字上可用?

另外值得注意的是,我不想捕获 SIGPIPE,因为客户端实际上是共享对象的一部分,许多应用程序使用该共享对象,这些应用程序可能已经或可能尚未定义自己的信号处理方法。

谢谢

【问题讨论】:

  • 您可以禁止本地 unix 套接字。 SIGPIPE 只为这种类型的套接字生成。但这可能会损害性能(很多)。
  • 另一个 SO 帖子可能有用:stackoverflow.com/questions/108183/…
  • 您也获得了用于 inet 流套接字的 SIGPIPE。
  • @Ilkka:你只需引入一个竞争条件,让错误更加罕见。
  • 我建议将问题标题更改为更具描述性的内容。也许“如何在不干扰主程序的情况下处理库中的 SIGPIPE”

标签: c++ linux sockets


【解决方案1】:

MSG_NOSIGNAL 作为标志传递给send()

【讨论】:

  • MSG_NOSIGNAL 不可移植。
  • @ukhardy: OP 在标签中声明 linux
  • 绝对是 Linux 的。我会玩这个,让你知道。感谢您的意见。
  • 谢谢,这正是我所需要的; send 现在在失败时返回 -1 而不是 SIGPIPE。有趣的是,我发现在 send 的手册页中没有提到 MSG_NOSIGNAL
【解决方案2】:

kroki 的 post 描述了似乎是一种好方法。

总结一下:

  • 检查 SIGPIPE 是否处于挂起状态。将其记录在变量中。如果它在我们开始之前就挂起,那么其他人阻止了 SIGPIPE。在这种情况下,请跳过下面的所有信号内容,然后进行写入。
  • sigblock SIGPIPE。
  • 写吧。
  • 检查 SIGPIPE 是否处于挂起状态。
  • 如果它处于挂起状态,则 sigtimedwait 等待它,超时为零。
  • 取消阻止 SIGPIPE。

【讨论】:

    猜你喜欢
    • 2017-07-31
    • 2013-05-24
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    相关资源
    最近更新 更多