![]() |
![]() |
![]() |
Examine or change the signal mask for a process
#include <signal.h> int sigprocmask( int how, const sigset_t *set, sigset_t *oset );
libc
The sigprocmask() function is used to examine or change (or both) the signal mask for the calling process. If the value of set isn't NULL, it points to a set of signals to be used to change the currently blocked set. The value of how indicates the manner in which the set is changed:
The set argument isn't changed. The resulting set is maintained in the process table of the calling process. If a signal occurs on a signal that's masked, it becomes pending, but doesn't affect the execution of the process. You may examine pending signals using the sigpending function. When a pending signal is unmasked, it's acted upon immediately, before this function returns.
If the argument oset isn't NULL, the previous mask is saved there. If the argument set is NULL, the argument how is ignored.
When a signal handler is invoked, the signal responsible is automatically masked before its handler is called. If the handler returns normally, the operating system restores the signal mask present just before the handler was called as an atomic operation. Changes made using sigprocmask() in the handler are undone.
The sigaction() function allows you to specify any mask that's applied before a handler is invoked. This can simplify multiple signal handler design.
#include <stdio.h> #include <stdlib.h> #include <signal.h> #include <unistd.h> int main( void ) { sigset_t set, oset, pset; sigemptyset( &set ); sigaddset( &set, SIGINT ); sigprocmask( SIG_BLOCK, &set, &oset ); printf( "Old set was %8.8ld.\n", oset ); sigpending( &pset ); printf( "Pending set is %8.8ld.\n", pset ); kill( getpid(), SIGINT ); sigpending( &pset ); printf( "Pending set is %8.8ld.\n", pset ); sigprocmask( SIG_UNBLOCK, &set, &oset ); /* The program terminates with a SIGINT */ return( EXIT_SUCCESS ); }
Safety: | |
---|---|
Cancellation point | No |
Interrupt handler | No |
Signal handler | Yes |
Thread | Yes |
errno, kill(), raise(), sigaction(), sigaddset(), sigdelset(), sigemptyset(), sigfillset(), sigismember(), signal(), sigpending()
![]() |
![]() |
![]() |