[英]Can writes to a datagram socket ever raise SIGPIPE?
我正在使用一些代码,这些代码需要安全防止由于SIGPIPE
而导致调用者被杀,但唯一的套接字写入它正在执行的是数据报套接字(UDP和Unix域数据报套接字)。 我需要担心SIGPIPE
吗? 我在套接字上使用connect
,但初步测试(在Linux上)表明如果没有人在Unix域套接字上监听,我只会在发送时获得ECONNREFUSED
。 不确定UDP会发生什么。
我可以将整个东西包装在黑客中以摆脱SIGPIPE
,但如果它不是问题,我宁愿节省开销并保持代码复杂性。
开放组是一回事,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上发生这种情况 - 尽管我从未试图关闭套接字然后写入它。
答案在send
规范中:
[EPIPE]插座关闭以进行写入,或者插座处于连接模式且不再连接。 在后一种情况下,如果套接字的类型为SOCK_STREAM或SOCK_SEQPACKET且未设置MSG_NOSIGNAL标志,则会向调用线程生成SIGPIPE信号。
http://pubs.opengroup.org/onlinepubs/9699919799/functions/send.html
因此,不,写入数据报套接字不会生成SIGPIPE
或EPIPE
错误。
根据man 2 write
在我的Debian框中man 2 write
,
EPIPE:fd连接到读取端关闭的管道或插座。 当发生这种情况时,写入过程也将收到SIGPIPE信号。 (因此,仅当程序捕获,阻止或忽略此信号时才会看到写入返回值。)
在写入套接字时似乎可以获得SIGPIPE,但是不清楚它是否可以专门用于UDP套接字。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.