如何避免管道破裂?

时间:2013-04-25 16:19:46

标签: c sockets

我尝试在c中开发聊天应用程序。我使用套接字和select()。 但是如果我在客户端之前关闭服务器,则客户端会显示消息“Broken Pipe”。 我用了select(),但我不知道如何避免它?

2 个答案:

答案 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信号注册处理程序(可能忽略该信号)。