我尝试在c中开发聊天应用程序。我使用套接字和select()
。
但是如果我在客户端之前关闭服务器,则客户端会显示消息“Broken Pipe”。
我用了select(),但我不知道如何避免它?
答案 0 :(得分:4)
您可以禁用信号:
signal(SIGPIPE, SIG_IGN);
虽然选择的答案是忽略信号流程,但还有其他选择:
使用带有MSG_NOSIGNAL的发送功能:
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);
答案 1 :(得分:0)
为PIPE信号注册处理程序(可能忽略该信号)。