【问题标题】:Detecting broken pipe in Solaris send() call在 Solaris send() 调用中检测损坏的管道
【发布时间】:2010-02-05 06:42:27
【问题描述】:

在 solaris 中如何检测 send() 调用中损坏的套接字?我不想使用信号。
我尝试了 SO_NOSIGPIPE 和 MSG_NOSIGNAL 但两者在 Solaris 中都不可用,并且我的程序因“破管”错误而被杀死。

有什么方法可以检测到破损的管道吗?

谢谢!

【问题讨论】:

    标签: c sockets solaris broken-pipe


    【解决方案1】:

    您必须使用sigaction() 专门忽略SIGPIPE 信号:

    struct sigaction act;
    
    act.sa_handler = SIG_IGN;
    sigaction(SIGPIPE, &act, NULL);
    

    ...然后send() 将返回-1,errno 设置为EPIPE

    【讨论】:

    • 谢谢。它类似于 signal() 函数。我不想使用 signal() 或 sigaction()。
    • 好吧,如果您不想在 Solaris 上遭受SIGPIPE 的痛苦,那是您唯一的选择。可以使用sigaction()的第三个参数来保存之前对信号的处理,如果需要,可以在调用send()后恢复。
    • MSG_NOSIGNAL 刚刚被 POSIX 在其最新版本中标准化,因此 Solaris 很可能会在某个时候采用它。
    【解决方案2】:

    我猜在 Solaris 中你只有有限的选择。 AFAIK,caf 建议的 sigaction 似乎是最好的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-31
      • 2010-10-28
      • 2011-03-19
      • 1970-01-01
      • 2012-05-15
      • 1970-01-01
      相关资源
      最近更新 更多