[zeromq-dev] Signal handling in blocking zmq_recv

Chris Wong chris at chriswongstudio.com
Tue Mar 9 19:49:51 CET 2010


If pthread_sigmask() is used to block any signals from interrupting the I/O thread, how do one unblock a blocked zmq_recv?  What's the alternative if we need to do so?


On Mar 9, 2010, at 12:43 PM, Martin Lucina wrote:

> Brian,
> ellisonbg at gmail.com said:
>> This example is helpful.
>>> http://github.com/mato/zeromq-examples/blob/master/zmq-camera.c
> Glad the example is useful...
>> Based on the information here:
>> http://docs.python.org/library/signal.html
>> I think it might be possible to handle this in python with 2 app
>> threads.  But because Python only handles signals in the main thread,
>> it would require having the main thread just do the signal handling.
>> This is on my list of things to explore.
> OK, it's been some time since I looked at the signal handling mess.
> First, 0MQ does not change any signal handlers on any application threads,
> ever. The only signal-related calls in 0MQ are in src/thread.cpp and that
> is to use pthread_sigmask() to block any signals from interrupting 0MQ I/O
> threads.
> The reason zmq-camera.c uses an explicit signal handling thread with a
> sigwait() loop is that as far as I'm aware this is the *only* way to
> reliably handle signals in a multithreaded program on POSIX platforms. Any
> other option seems to result in various different non-deterministic
> behaviours.
> The problem with Python (or Ruby, or any other) language runtime is that as
> far as I know they don't neccessarily do this. Or if they do, they're doing
> something *else* that's somehow interacting with 0MQ's use of
> pthread_sigmask(), not that that should ever happen. I spent a day or so
> investigating what it is that actually breaks signal handling with 0MQ and
> Python and wound up none the wiser.
> So, good luck, if you do discover what the problem is that would be
> amazing!
> Cheers,
> -mato

More information about the zeromq-dev mailing list