
sig::action sa; sa.set_handler( SIG_IGN); sig::action old_sa( sa.run( SIGPIPE) ); boost::shared_ptr< void > guard( static_cast< void * >( 0), boost::bind( & sig::action::run, old_sa, SIGPIPE) );
::write(...)
As I mentioned in another message, at least on Linux, sendmsg can be used as replacement for writev that allows specification of MSG_NOSIGNAL.
Yes.
Your code might potentially be useful on Solaris and other platforms that do not support disabling the signal through mechanism like MSG_NOSIGNAL, although your code seems to introduce quite a lot of overhead per write call.
The code could be expanded to: struct sigaction sa, old_sa; if ( ::sigemptyset( & sa.sa_mask) < 0) throw std::runtime_error( ::strerror( errno) ); sa.sa_flags = ZERO; sa.sa_handler = SIG_IGN; if ( ::sigaction( SIGPIPE, & sa, & old_sa) < 0) throw std::runtime_error( ::strerror( errno) ); // shared_ptr has to call ::sigaction( SIGPIPE, & old_sa, 0) in order to // reset original signal handler So it seams to be only 3 clib-function calls for each write operation. Oliver