gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:13:43 29 4
gpt4 key购买 nike

我有一个小型服务器程序,它接受 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(或正确处理它们),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/108183/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com