如何在多线程程序中防止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 而退出。
谁能帮我解决这个问题?
我的代码:
通常的方法是忽略 SIGPIPE(signal(SIGPIPE, SIG_IGN);
-- 你说你已经完成了),然后 CAREFULLY 检查 EVERY 编写并发送调用以确保您正确检查 return 值并处理您遇到的任何 EPIPE(或其他)错误。
忽略 SIGPIPE 的危险在于,很容易让程序在写入已关闭的连接后运行,忽略错误,并且永远不会终止。
一旦忽略 SIGPIPE,您的程序将永远不会因为 SIGPIPE 而退出。
我写了一个小小的 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 而退出。
谁能帮我解决这个问题?
我的代码:
通常的方法是忽略 SIGPIPE(signal(SIGPIPE, SIG_IGN);
-- 你说你已经完成了),然后 CAREFULLY 检查 EVERY 编写并发送调用以确保您正确检查 return 值并处理您遇到的任何 EPIPE(或其他)错误。
忽略 SIGPIPE 的危险在于,很容易让程序在写入已关闭的连接后运行,忽略错误,并且永远不会终止。
一旦忽略 SIGPIPE,您的程序将永远不会因为 SIGPIPE 而退出。