我正在使用一些代码,这些代码需要安全地防止杀死调用者SIGPIPE
,但它正在执行的唯一套接字写入是数据报套接字(UDP 和 Unix 域数据报套接字)。我需要担心SIGPIPE
吗?我connect
在套接字上使用,但初步测试(在 Linux 上)表明,ECONNREFUSED
如果没有人在 Unix 域套接字上监听,我只会发送。不确定UDP会发生什么。
我可以将整个事情包装在 hacks 中以摆脱SIGPIPE
,但如果这不是问题,我宁愿节省开销并降低代码复杂性。
答案在规范中send
:
[EPIPE] 套接字关闭写入,或套接字处于连接模式,不再连接。在后一种情况下,如果套接字的类型为 SOCK_STREAM 或 SOCK_SEQPACKET 并且未设置 MSG_NOSIGNAL 标志,则会向调用线程生成 SIGPIPE 信号。
http://pubs.opengroup.org/onlinepubs/9699919799/functions/send.html
因此,不,对数据报套接字的写入不会生成SIGPIPE
或EPIPE
错误。
开放组是一回事,苹果是另一回事。正如我最近的一些崩溃日志所揭示的那样,当写入死的 UDP 套接字时,绝对有可能在iOS上获得 SIGPIPE。iOS 倾向于在应用程序处于后台时关闭 UDP 套接字,写入这些套接字会弹出 SIGPIPE。
从我的崩溃日志(由 testflightapp 提供):
异常最新受害者发生
SIGPIPE
2 libsystem_c.dylib 0x32df47ec _sigtramp + 48
3 即时通话 0x0005b10e -[IPRSNetDatagramSocket send:size:to:] (iprs_iphone_net.m:671)...
不记得在 Linux、Solaris 或 Windows 上发生过这种情况——尽管我从未尝试关闭套接字然后对其进行写入。
根据man 2 write
我的 Debian 盒子,
EPIPE:fd 连接到读取端关闭的管道或套接字。当这种情况发生时,写入过程也会收到一个 SIGPIPE 信号。(因此,只有当程序捕获、阻塞或忽略此信号时,才会看到写入返回值。)
似乎在写入套接字时可以获得 SIGPIPE,但尚不清楚它是否会专门针对 UDP 套接字发生。