繁体   English   中英

如何在发送文件 function 中防止 SIGPIPE

[英]How to prevent SIGPIPE in sendfile function

美好的一天,我有一个小型 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?

如何在线程中处理或阻止SIGPIPE?

至少三种方式:

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

如果可能的话,我会去第一个(它不是便携式的)。 而不是信号,您将得到errno = EPIPE的-1返回。

看起来, sendfile()没有任何标志(例如send()MSG_NOSIGNAL ),所以一种选择是使用signal(SIGPIPE, SIG_IGN)禁用 SIGPIPE ,但这不会让像gdb这样的调试器停止你在SIGPIPE上的进程. 如果您希望gdb保持代码运行,请尝试在gdbhandle SIGPIPE nostop或将sendfile()替换为带有MSG_NOSIGNAL标志的read/send循环。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM