|
Boost : |
From: Jeremy Maitin-Shepard (jbms_at_[hidden])
Date: 2005-12-13 01:52:20
<Oliver.Kowalke_at_[hidden]> writes:
>> Hi Jeremy,
>> Unfortunately this flag doesn't seem to be available on Solaris, which
>> does raise SIGPIPE too. It also doesn't work with writev.
> I use this code:
> ...
> 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(...)
> ...
> sig:action abstracts struct sigaction, clib function ::sigaction and so
> on.
> After sa.run( SIGPIPE) the signal is ignored and write would return
> EPIPE. The shared_ptr resets the original signal handler after getting
> out of scope.
As I mentioned in another message, at least on Linux, sendmsg can be
used as replacement for writev that allows specification of
MSG_NOSIGNAL. 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.
-- Jeremy Maitin-Shepard
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk