Estoy usando una tubería para comunicarme entre dos procesos en Gnu/Linux. El extremo de recepción cierra el conducto mientras que el extremo de envío todavía está tratando de enviar datos. Aquí hay un código que emula la situación.¿Cómo evito SIGPIPE cuando uso boost :: asio?
#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;
}
Cuando lo ejecuto obtengo un SIGPIPE; situación clásica, lo sé. Sin embargo, veo que boost::asio::error::basic_errors
tiene un valor de broken_pipe
. Esperaría que se devuelva en el error_code sin que se genere una señal.
¿Se puede hacer esto sin crear un controlador SIGPIPE para mi proceso? Por ejemplo, ¿hay alguna opción de configuración para impulsar :: asio que me falta? Tal vez algo que permita MSG_NOSIGNAL en la implementación?
1 para el reproductor –