[Previous] [Contents] [Next]

sigprocmask()

Examine or change the signal mask for a process

Synopsis:

#include <signal.h>

int sigprocmask( int how,
                 const sigset_t *set,
                 sigset_t *oset );

Library:

libc

Description:

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:

SIG_BLOCK
Add the signals pointed to by set to the process mask.
SIG_UNBLOCK
Remove the signals pointed to by set from the process mask.
SIG_SETMASK
Set the process mask to be the signals pointed to by set.

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.

Returns:

0
Success.
-1
An error occurred; errno is set.

Errors:

EAGAIN
Insufficient system resources are available to mask the signals.
EFAULT
A fault occurred trying to access the buffers provided.
EINVAL
The signal signo isn't valid.

Examples:

#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 );
  }

Classification:

POSIX 1003.1

Safety:
Cancellation point No
Interrupt handler No
Signal handler Yes
Thread Yes

See also:

errno, kill(), raise(), sigaction(), sigaddset(), sigdelset(), sigemptyset(), sigfillset(), sigismember(), signal(), sigpending()


[Previous] [Contents] [Next]