小编典典

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

all

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

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

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


阅读 83

收藏
2022-04-29

共1个答案

小编典典

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

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

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

signal(SIGPIPE, SIG_IGN);

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

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

2022-04-29