6

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

我可以将整个事情包装在 hacks 中以摆脱SIGPIPE,但如果这不是问题,我宁愿节省开销并降低代码复杂性。

4

3 回答 3

12

答案在规范中send

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

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

因此,不,对数据报套接字的写入不会生成SIGPIPEEPIPE错误。

于 2011-04-13T21:59:21.843 回答
8

开放组是一回事,苹果是另一回事。正如我最近的一些崩溃日志所揭示的那样,当写入死的 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 上发生过这种情况——尽管我从未尝试关闭套接字然后对其进行写入。

于 2012-09-12T13:07:33.267 回答
1

根据man 2 write我的 Debian 盒子,

EPIPE:fd 连接到读取端关闭的管道或套接字。当这种情况发生时,写入过程也会收到一个 SIGPIPE 信号。(因此,只有当程序捕获、阻塞或忽略此信号时,才会看到写入返回值。)

似乎在写入套接字时可以获得 SIGPIPE,但尚不清楚它是否会专门针对 UDP 套接字发生。

于 2011-04-13T22:00:41.280 回答