Sto usando una pipe per comunicare tra due processi su Gnu/Linux. L'estremità ricevente chiude la pipe mentre l'invio sta ancora tentando di inviare dati. Ecco un codice che emula la situazione.Come si impedisce SIGPIPE quando si utilizza 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;
}
Quando lo eseguo, ricevo SIGPIPE; situazione classica, lo so. Tuttavia, vedo che boost::asio::error::basic_errors
ha un valore broken_pipe
. Mi aspetto che venga restituito nel codice_errore senza che venga generato un segnale.
Questo può essere fatto senza creare un gestore SIGPIPE per il mio processo? Ad esempio, esiste un'opzione di configurazione per potenziare :: asio che mi manca? Forse qualcosa che abiliterebbe MSG_NOSIGNAL nell'implementazione?
+1 per la bella risposta esauriente riproduttore –