如何避免"broken pipe"错误?

4

我尝试使用C语言开发一个聊天应用,我使用了套接字和 select() 函数。但是如果在客户端关闭之前关闭服务器,客户端会收到一个 "Broken Pipe" 的消息。我使用了 select() 函数,但不知道如何避免这种情况。


可能是重复的问题:如何防止 SIGPIPE(或正确处理它们) - user405725
不要只是关闭管道,要友好地告别。这样另一端就知道也要关闭它。 - Hans Passant
2个回答

5
您可以禁用信号:
signal(SIGPIPE, SIG_IGN);

尽管所选答案是忽略信号处理程序,但还有其他选择:
使用带有MSG_NOSIGNAL标志的send函数:
 send(con, buff_enviar+enviado, length-enviado, MSG_NOSIGNAL);

在套接字级别上禁用SIGPIPE(不是所有内核都支持):

int flag = 1;
setsockopt(con, SOL_SOCKET, SO_NOSIGPIPE, &flag, sizeof(flag));

为调用线程禁用SIGPIPE(您可以在之后恢复它):

sigset_t set;
sigemptyset (&set);
sigaddset (&set, SIGPIPE);
pthread_sigmask(SIG_BLOCK, &set, NULL);

0
注册一个PIPE信号的处理程序(可以忽略该信号)。

有其他方法吗?我不想捕获信号管道。 - heruma
@heruma:你可以使用SIG_IGN来忽略SIGPIPE。只需阅读手册页面或其他相关文档即可。一些API还支持额外的管道选项,以禁用内核传递SIGPIPE信号。请参见https://dev59.com/RHVD5IYBdhLWcg3wDHDm。 - user405725

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接