Я использую канал для связи между двумя процессами в 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
. Я ожидаю, что он будет возвращен в коде ошибки без повышенного сигнала.
Можно ли это сделать без создания обработчика SIGPIPE для моего процесса? Например, есть ли параметр конфигурации для boost :: asio, который мне не хватает? Может быть, что-то, что позволит включить MSG_NOSIGNAL в реализации?