繁体   English   中英

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

[英]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

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

根据man 2 write在我的Debian框中man 2 write

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

在写入套接字时似乎可以获得SIGPIPE,但是不清楚它是否可以专门用于UDP套接字。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM