2011-04-13 28 views
5

我正在处理一些代码,因为SIGPIPE而需要安全地阻止调用者,但是它唯一执行的套接字写入数据报套接字(UDP和Unix域数据报套接字)。我需要担心SIGPIPE?我在套接字上使用了connect,但是初步测试(在Linux上)显示,如果没有人在Unix域套接字上侦听,我就会发送ECONNREFUSED。不知道UDP会发生什么。可以写入数据报套接字有没有提出SIGPIPE?

我可以将所有东西都包装在黑客中以摆脱SIGPIPE,但是如果这不是问题,我宁愿节省开销并保持代码复杂性。

+0

我打算给你一个不好的答案。我认为在Linux系统启动时启动应用程序之前我已经看到它发生了。我不能说它确实是一个数据报套接字,它是潜在的问题,但据我所知,我们没有为该应用程序使用任何TCP套接字。只是一个测试案例,供您考虑它是否适用于您。 – Jeff 2011-04-14 01:25:54

+0

我想我可能只是安排使用'sendto'而不是'write',所以我可以传递那个禁用'SIGPIPE'的标志。 – 2011-04-14 01:54:43

回答

8

答案是在本说明书中为send

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

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

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

+0

上面的文字是不是真的说你可以在UDP中得到它,如果“套接字关闭写入”(无论这意味着什么)? – 2017-02-10 21:35:25

+0

@ T.E.D .:也许(如果shutdown-for-write在数据报套接字上工作),但是这是一个没有程序员意图或错误就不会发生的情况。这不是由同伴造成的。 – 2017-02-10 21:59:44

1

man 2 write在我的Debian框,

EPIPE:fd被连接到管道或插座,其读出端是封闭的。发生这种情况时,写入过程也会收到一个SIGPIPE信号。 (因此,只有在程序捕获,阻止或忽略此信号时才会看到写入 的返回值。)

看起来,写入套接字时可能获得SIGPIPE,但尚不清楚它是否可能发生专门用于UDP套接字。

+0

'send'的手册页更具体一点,但它不像POSIX对'send'所说的那样清楚。 – 2011-04-13 23:31:23

+0

确实,@R ...我在你发布它之后立即提出并回答你的答案。我只是想让我的帖子滚动。 – ikegami 2011-04-14 00:47:11

8

开放组是一回事,苹果是另一回事。 当写入一个死的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这样的情况 - 虽然我从来没有试图关闭套接字,然后写它。

+0

关闭一个套接字,然后写入它不会给'SIGPIPE'或'EPIPE';它会给出'EBADF'。 iOS必须将套接字放入一些特殊的非标准模式才能产生'SIGPIPE'。无论如何,我的问题被标记为POSIX,因为我正在寻找标准的行为,但你的答案也是信息。 – 2012-09-12 13:31:48

相关问题