【发布时间】:2018-04-04 15:40:37
【问题描述】:
我写了一个很小的 httpd。但是如果我在短时间内向httpd发送了很多请求,httpd会因为SIGPIPE而退出。
在谷歌上搜索后,我添加了
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 仍然退出。
谁能帮我解决这个问题?
我的代码:
【问题讨论】:
-
您是否尝试过使用
gdb进行调试?您可以使用gdb handle SIGPIPE nostop手动禁用SIGPIPE。 -
您尝试过以多种方式做同样的事情(忽略 SIGPIPE,阻止 SIGPIPE,和告诉
send忽略 SIGPIPE)所以它应该真的 i> 工作 ;-) 你确定程序退出是因为 SIGPIPE 而不是其他问题?您如何确定 SIGPIPE 是退出的原因? -
进行此更改后,您是否重新构建了应用程序?
-
send可能只进行部分发送,您的代码无法处理,因为它不检查send调用的返回值。 -
你也应该在这里发布你的代码。
标签: c linux sockets network-programming