如何防止 SIGPIPE(或正确处理它们)

2024-03-04

我有一个小型服务器程序,它接受 TCP 或本地 UNIX 套接字上的连接,读取一个简单的命令并(取决于命令)发送回复。

问题是客户可能对答案不感兴趣,有时会提前退出。所以写入该套接字将导致SIGPIPE并使我的服务器崩溃。

防止这里崩溃的最佳做法是什么?有没有办法检查线路的另一端是否仍在阅读? (select()在这里似乎不起作用,因为它总是说套接字是可写的)。或者我应该抓住SIGPIPE与处理程序并忽略它?


您通常想忽略SIGPIPE并直接在代码中处理错误。这是因为 C 中的信号处理程序对其功能有很多限制。

最便携的方法是设置SIGPIPE处理程序到SIG_IGN。这将防止任何套接字或管道写入导致SIGPIPE signal.

忽略SIGPIPE信号,使用以下代码:

signal(SIGPIPE, SIG_IGN);

如果您正在使用send()调用,另一种选择是使用MSG_NOSIGNAL选项,这将把SIGPIPE行为按每次调用关闭。请注意,并非所有操作系统都支持MSG_NOSIGNAL flag.

最后,您可能还想考虑SO_SIGNOPIPE可以设置的套接字标志setsockopt()在某些操作系统上。这将防止SIGPIPE由于仅写入其所设置的套接字而引起。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何防止 SIGPIPE(或正确处理它们) 的相关文章

随机推荐