好日子,我有一个小的http服务器,我有线程池当前连接,当我发送文件的线程,我得到信号SIGPIPE和我的服务器崩溃.部分代码://线程中:
detail::create_headers(headers,stat_buf.st_size,mime_types::extension_to_type(extension.c_str()));
if(detail::write_to_client(fd_client,headers,unicode_strlen(headers))!=-1)
{
while(offset!=stat_buf.st_size)
{
if(sendfile(fd_client,src,&offset,stat_buf.st_size)==-1)
{
DEBUG_MSG_FORMAT("sendfile error: %d",errno);
break;
}
}
}
//和:
size_t write_to_client(int fd_client,const void *buf,size_t len)
{
int optval = 1;
setsockopt (fd_client, SOL_TCP, TCP_CORK, &optval, sizeof (int));
size_t result = write(fd_client,buf,len);
if(result==-1)
{
DEBUG_MSG_FORMAT("write error: %d",errno);
}
optval = 0;
setsockopt (fd_client, SOL_TCP, TCP_CORK, &optval, sizeof (int));
return result;
}
如何处理或防止线程中的SIGPIPE?
2条答案
按热度按时间eulz3vhy1#
如何处理或防止线程中的SIGPIPE?
至少有三种方式:
SO_NOSIGPIPE
套接字选项MSG_NOSIGNAL
标志用于send(2)
(特定于Linux)SIG_IGN
)或为其建立一个真实的的处理程序如果可能的话,我会选择第一个(它不是可移植的),而不是信号,你会得到
errno = EPIPE
的返回值-1。2g32fytz2#
看起来,
sendfile()
没有任何标志(例如send()
对MSG_NOSIGNAL
所做的),所以一个选项是使用signal(SIGPIPE, SIG_IGN)
禁用SIGPIPE,但这并不会让gdb
这样的调试器停止SIGPIPE
上的进程。在gdb
中尝试handle SIGPIPE nostop
,或者用带有MSG_NOSIGNAL
标志的read/send
循环替换sendfile()
。