Я использую канал для связи между двумя процессами в 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 в реализации?