我有一个小型服务器程序,它接受 TCP 或本地 UNIX 套接字上的连接,读取一个简单的命令并(取决于命令)发送回复。
问题是客户可能对答案不感兴趣,有时会提前退出。因此,写入该套接字将导致 aSIGPIPE并使我的服务器崩溃。
SIGPIPE
在这里防止崩溃的最佳做法是什么?有没有办法检查线路的另一端是否仍在阅读?(select()似乎在这里不起作用,因为它总是说套接字是可写的)。还是我应该SIGPIPE用处理程序捕获并忽略它?
select()
您通常希望忽略SIGPIPE并直接在代码中处理错误。这是因为 C 中的信号处理程序对它们的功能有很多限制。
最便携的方法是将SIGPIPE处理程序设置为SIG_IGN. 这将防止任何套接字或管道写入导致SIGPIPE信号。
SIG_IGN
要忽略该SIGPIPE信号,请使用以下代码:
signal(SIGPIPE, SIG_IGN);
如果您正在使用send()通话,另一种选择是使用该MSG_NOSIGNAL选项,这将SIGPIPE在每次通话的基础上关闭行为。请注意,并非所有操作系统都支持该MSG_NOSIGNAL标志。
send()
MSG_NOSIGNAL
最后,您可能还需要考虑SO_SIGNOPIPE可以setsockopt()在某些操作系统上设置的套接字标志。这将防止SIGPIPE仅由对其设置的套接字的写入引起。
SO_SIGNOPIPE
setsockopt()