如何防止多线程程序中的SIGPIPE?

时间:2018-04-04 15:40:37

标签: c linux sockets network-programming

我写了一个小httpd。但是如果我在很短的时间内向httpd发送了许多请求,httpd将因为SIGPIPE而退出。

在Google上搜索后,我添加了

signal(SIGPIPE, SIG_IGN);
sigset_t signal_mask; 
sigemptyset(&signal_mask); 
sigaddset(&signal_mask, SIGPIPE); 
if(pthread_sigmask(SIG_BLOCK, &signal_mask, NULL) == -1) 
perror("SIGPIPE"); 

send(fd, buf, strlen(buf), MSG_NOSIGNAL);

在我的代码中防止SIGPIPE。

但由于SIGPIPE,httpd仍然退出。

任何人都可以帮我解决问题吗?

我的代码:

httpd.c

threadpool.c

1 个答案:

答案 0 :(得分:1)

通常的方法是忽略SIGPIPE(signal(SIGPIPE, SIG_IGN); - 你说你已经完成了),然后小心检查每次写和发送电话确保您正确检查返回值并处理您获得的任何EPIPE(或其他)错误。

忽略SIGPIPE的危险在于,很容易得到一个程序,该程序在写入已关闭的连接时会运行,忽略错误,并且永远不会终止。

一旦忽略了SIGPIPE,您的程序将永远不会因SIGPIPE而退出。