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

我有一个小型服务器程序,它接受TCP或本地UNIX套接字上的连接,读取一个简单的命令,并根据命令发送回复。问题是,客户端可能对答案有兴趣并且提前退出,因此写入该套接字将导致SIGPIPE并使我的服务器崩溃。什么是防止崩溃这里的最佳实践?有没有办法检查线的另一边是否还在读? (select()似乎不工作在这里,因为它总是说套接字是可写的)。还是应该用一个处理程序捕获SIGPIPE并忽略它?
最佳答案
你通常想要忽略SIGPIPE并在你的代码中直接处理错误。这是因为C中的信号处理程序对它们可以做什么有很多限制。

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

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

signal(SIGPIPE, SIG_IGN);

如果使用send()调用,另一个选项是使用MSG_NOSIGNAL选项,这将在每次调用的基础上关闭SIGPIPE行为。请注意,并非所有操作系统都支持MSG_NOSIGNAL标志。

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

转载注明原文:c – 如何防止SIGPIPE(或正确处理它们) - 代码日志