C语言 如何防止sendfile函数中的SIGPIPE

d5vmydt9  于 2023-01-29  发布在  其他
关注(0)|答案(2)|浏览(140)

好日子,我有一个小的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?

eulz3vhy

eulz3vhy1#

如何处理或防止线程中的SIGPIPE?
至少有三种方式:

  • 使用SO_NOSIGPIPE套接字选项
  • MSG_NOSIGNAL标志用于send(2)(特定于Linux)
  • 忽略sigpipe(使用SIG_IGN)或为其建立一个真实的的处理程序

如果可能的话,我会选择第一个(它不是可移植的),而不是信号,你会得到errno = EPIPE的返回值-1。

2g32fytz

2g32fytz2#

看起来,sendfile()没有任何标志(例如send()MSG_NOSIGNAL所做的),所以一个选项是使用signal(SIGPIPE, SIG_IGN)禁用SIGPIPE,但这并不会让gdb这样的调试器停止SIGPIPE上的进程。在gdb中尝试handle SIGPIPE nostop,或者用带有MSG_NOSIGNAL标志的read/send循环替换sendfile()

相关问题