Как мне предотвратить SIGPIPE при использовании boost :: asio?

Я использую канал для связи между двумя процессами в Gnu / Linux. Принимающая сторона закрывает канал, в то время как отправляющая сторона все еще пытается отправить данные. Вот код, имитирующий ситуацию.

#include <unistd.h>                                                              
#include <boost/asio.hpp>                                                        

int main()                                                                       
{                                                                                
    int pipe_fds[2];                                             
    if( ::pipe(pipe_fds) != 0 ) return 1;                                        
    // close the receiving end 
    ::close( pipe_fds[0] );

    boost::asio::io_service io;                                             
    boost::asio::posix::stream_descriptor sd( io, pipe_fds[1] );     
    boost::system::error_code ec;                                                
    sd.write_some( boost::asio::buffer("blah"), ec );

    return 0;                                                                    
}

Когда я запускаю его, я получаю SIGPIPE; Классическая ситуация, я знаю. Однако я вижу, что boost :: asio :: error :: basic_errors имеет значение broken_pipe . Я ожидал, что это будет возвращено в error_code без поднятия сигнала.

Можно ли это сделать без создания обработчика SIGPIPE для моего процесса? Например, есть ли параметр конфигурации для boost :: asio, который мне не хватает? Может быть, что-то, что включит MSG_NOSIGNAL в реализации?

14
задан kalaxy 3 November 2011 в 15:25
поделиться