【发布时间】:2010-02-05 06:42:27
【问题描述】:
在 solaris 中如何检测 send() 调用中损坏的套接字?我不想使用信号。
我尝试了 SO_NOSIGPIPE 和 MSG_NOSIGNAL 但两者在 Solaris 中都不可用,并且我的程序因“破管”错误而被杀死。
有什么方法可以检测到破损的管道吗?
谢谢!
【问题讨论】:
标签: c sockets solaris broken-pipe
在 solaris 中如何检测 send() 调用中损坏的套接字?我不想使用信号。
我尝试了 SO_NOSIGPIPE 和 MSG_NOSIGNAL 但两者在 Solaris 中都不可用,并且我的程序因“破管”错误而被杀死。
有什么方法可以检测到破损的管道吗?
谢谢!
【问题讨论】:
标签: c sockets solaris broken-pipe
您必须使用sigaction() 专门忽略SIGPIPE 信号:
struct sigaction act;
act.sa_handler = SIG_IGN;
sigaction(SIGPIPE, &act, NULL);
...然后send() 将返回-1,errno 设置为EPIPE。
【讨论】:
SIGPIPE 的痛苦,那是您唯一的选择。可以使用sigaction()的第三个参数来保存之前对信号的处理,如果需要,可以在调用send()后恢复。
我猜在 Solaris 中你只有有限的选择。 AFAIK,caf 建议的 sigaction 似乎是最好的解决方案。
【讨论】: