2

こんにちは、スレッドプールの現在の接続がある小さな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を処理または防止するにはどうすればよいですか?

4

1 に答える 1

2

スレッドでSIGPIPEを処理または防止するにはどうすればよいですか?

少なくとも 3 つの方法:

  • SO_NOSIGPIPEソケットオプションを使用する
  • MSG_NOSIGNALフラグを使用send(2)(Linux 固有)
  • ( を使用して) sigpipe を無視するSIG_IGNか、そのための実際のハンドラーを確立します。

可能であれば最初のものを選びます(移植性がありません)。シグナルの代わりに、 で -1 が返されますerrno = EPIPE

于 2013-01-14T07:30:50.927 に答える