我尝试使用C语言开发一个聊天应用,我使用了套接字和 select()
函数。但是如果在客户端关闭之前关闭服务器,客户端会收到一个 "Broken Pipe" 的消息。我使用了 select() 函数,但不知道如何避免这种情况。
signal(SIGPIPE, SIG_IGN);
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);
SIG_IGN
来忽略SIGPIPE
。只需阅读手册页面或其他相关文档即可。一些API还支持额外的管道选项,以禁用内核传递SIGPIPE
信号。请参见https://dev59.com/RHVD5IYBdhLWcg3wDHDm。 - user405725