Advanced Programming in the UNIX® Environment

(lily) #1
ptg10805159

454 Thread Control Chapter 12


#include <signal.h>
int pthread_sigmask(inthow,const sigset_t *restrict set,
sigset_t *restrictoset);
Returns: 0 if OK, error number on failure
The pthread_sigmask function is identical to sigprocmask,except that
pthread_sigmaskworks with threads and returns an error code on failureinstead of
settingerrnoand returning−1. Recall that thesetargument contains the set of signals
that the thread will use to modify its signal mask. Thehowargument can take on one of
three values:SIG_BLOCK to add the set of signals to the thread’s signal mask,
SIG_SETMASK to replace the thread’s signal mask with the set of signals, or
SIG_UNBLOCKto remove the set of signals from the thread’s signal mask. If theoset
argument is not null, the thread’s previous signal mask is stored in thesigset_t
structure to which it points.Athread can get its current signal mask by setting theset
argument toNULL and setting the oset argument to the address of a sigset_t
structure. In this case, thehowargument is ignored.
Athread can wait for one or moresignals to occur by callingsigwait.
#include <signal.h>
int sigwait(const sigset_t *restrictset,int *restrictsignop);
Returns: 0 if OK, error number on failure
Thesetargument specifies the set of signals for which the thread is waiting. On return,
the integer to whichsignoppoints will contain the number of the signal that was
delivered.
If one of the signals specified in the set is pending at the timesigwaitis called,
thensigwaitwill return without blocking. Beforereturning,sigwaitremoves the
signal from the set of signals pending for the process. If the implementation supports
queued signals, and multiple instances of a signal arepending,sigwaitwill remove
only one instance of the signal; the other instances will remain queued.
To avoid erroneous behavior,a thread must block the signals it is waiting for before
callingsigwait.Thesigwaitfunction will atomically unblock the signals and wait
until one is delivered. Beforereturning,sigwaitwill restorethe thread’s signal mask.
If the signals arenot blocked at the time thatsigwaitis called, then a timing window
is opened up whereone of the signals can be delivered to the thread before it completes
its call tosigwait.
The advantage to usingsigwaitis that it can simplify signal handling by allowing
us to treat asynchronously generated signals in a synchronous manner.Wecan prevent
the signals from interrupting the threads by adding them to each thread’s signal mask.
Then we can dedicate specific threads to handling the signals. These dedicated threads
can make function calls without having to worry about which functions aresafe to call
from a signal handler,because they arebeing called from normal thread context, not
from a traditional signal handler interrupting a normal thread’s execution.
If multiple threads areblocked in calls tosigwaitfor the same signal, only one of
the threads will return fromsigwaitwhen the signal is delivered. Ifasignal is being
Free download pdf