我有一个小型服务器程序,它接受 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(使用前将#替换为@)