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

时间:2011-04-13 21:22:00

标签: c sockets posix datagram sigpipe

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

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

3 个答案:

答案 0 :(得分:8)

答案在send

的规范中
  

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

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

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

答案 1 :(得分: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上发生这种情况 - 尽管我从未试图关闭套接字然后写入它。

答案 2 :(得分:1)

根据我的Debian框中的man 2 write

EPIPE:fd连接到读取结束的管道或套接字。当发生这种情况时,写入过程也将收到SIGPIPE信号。 (因此,写               仅当程序捕获,阻止或忽略此信号时才会看到返回值。)

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