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

How to prevent SIGPIPE in multi-thread program?

我写了一个小小的 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。

但是 httpd 仍然因为 SIGPIPE 而退出。

谁能帮我解决这个问题?

我的代码:

httpd.c

threadpool.c

通常的方法是忽略 SIGPIPE(signal(SIGPIPE, SIG_IGN); -- 你说你已经完成了),然后 CAREFULLY 检查 EVERY 编写并发送调用以确保您正确检查 return 值并处理您遇到的任何 EPIPE(或其他)错误。

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

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