可以写入数据报套接字是否会引发SIGPIPE?

R..*_*R.. 5 c sockets posix datagram sigpipe

我正在使用一些代码,这些代码需要安全防止因为杀死调用者SIGPIPE,但唯一的套接字写入它正在执行的是数据报套接字(UDP和Unix域数据报套接字).我需要担心SIGPIPE吗?我connect在套接字上使用,但初步测试(在Linux上)表明,ECONNREFUSED如果没有人在Unix域套接字上监听,我就会继续发送.不确定UDP会发生什么.

我可以将整个东西包装在黑客中去除SIGPIPE,但如果它不是问题,我宁愿节省开销并保持代码复杂性.

R..*_*R.. 10

答案在规范中send:

[EPIPE]插座关闭以进行写入,或者插座处于连接模式且不再连接.在后一种情况下,如果套接字的类型为SOCK_STREAM或SOCK_SEQPACKET且未设置MSG_NOSIGNAL标志,则会向调用线程生成SIGPIPE信号.

http://pubs.opengroup.org/onlinepubs/9699919799/functions/send.html

因此,没有,写入数据报套接字不产生SIGPIPEEPIPE错误.


Mos*_*ieb 8

开放组是一回事,Apple是另一回事.当写入死UDP套接字时,绝对有可能在iOS上获得一个SIGPIPE ,因为我最近发现了一些崩溃日志.iOS倾向于在应用程序处于后台时关闭UDP套接字,写入这些套接字可以弹出SIGPIPE.
从我的崩溃日志(由testflightapp提供):

例外最新受害者出现
SIGPIPE
2 libsystem_c.dylib 0x32df47ec _sigtramp + 48
3即时通话0x0005b10e - [IPRSNetDatagramSocket发送:大小:到:](iprs_iphone_net.m:671)...

不记得在Linux,Solaris或Windows上发生这种情况 - 尽管我从未试图关闭套接字然后写入它.