| .\" Copyright (c) 2005 Michael Kerrisk |
| .\" based on earlier work by faith@cs.unc.edu and |
| .\" Mike Battersby <mib@deakin.edu.au> |
| .\" |
| .\" %%%LICENSE_START(VERBATIM) |
| .\" Permission is granted to make and distribute verbatim copies of this |
| .\" manual provided the copyright notice and this permission notice are |
| .\" preserved on all copies. |
| .\" |
| .\" Permission is granted to copy and distribute modified versions of this |
| .\" manual under the conditions for verbatim copying, provided that the |
| .\" entire resulting derived work is distributed under the terms of a |
| .\" permission notice identical to this one. |
| .\" |
| .\" Since the Linux kernel and libraries are constantly changing, this |
| .\" manual page may be incorrect or out-of-date. The author(s) assume no |
| .\" responsibility for errors or omissions, or for damages resulting from |
| .\" the use of the information contained herein. The author(s) may not |
| .\" have taken the same level of care in the production of this manual, |
| .\" which is licensed free of charge, as they might when working |
| .\" professionally. |
| .\" |
| .\" Formatted or processed versions of this manual, if unaccompanied by |
| .\" the source, must acknowledge the copyright and authors of this work. |
| .\" %%%LICENSE_END |
| .\" |
| .\" 2005-09-15, mtk, Created new page by splitting off from sigaction.2 |
| .\" |
| .TH SIGPROCMASK 2 2017-09-15 "Linux" "Linux Programmer's Manual" |
| .SH NAME |
| sigprocmask, rt_sigprocmask \- examine and change blocked signals |
| .SH SYNOPSIS |
| .B #include <signal.h> |
| .PP |
| .nf |
| /* Prototype for the glibc wrapper function */ |
| .BI "int sigprocmask(int " how ", const sigset_t *" set ", sigset_t *" oldset ); |
| .PP |
| /* Prototype for the underlying system call */ |
| .BI "int rt_sigprocmask(int " how ", const kernel_sigset_t *" set , |
| .BI " kernel_sigset_t *" oldset ", size_t " sigsetsize ); |
| .PP |
| /* Prototype for the legacy system call (deprecated) */ |
| .BI "int sigprocmask(int " how ", const old_kernel_sigset_t *" set , |
| .BI " old_kernel_sigset_t *" oldset ); " |
| .fi |
| .PP |
| .in -4n |
| Feature Test Macro Requirements for glibc (see |
| .BR feature_test_macros (7)): |
| .in |
| .PP |
| .ad l |
| .BR sigprocmask (): |
| _POSIX_C_SOURCE |
| .ad b |
| .SH DESCRIPTION |
| .BR sigprocmask () |
| is used to fetch and/or change the signal mask of the calling thread. |
| The signal mask is the set of signals whose delivery is currently |
| blocked for the caller |
| (see also |
| .BR signal (7) |
| for more details). |
| .PP |
| The behavior of the call is dependent on the value of |
| .IR how , |
| as follows. |
| .TP |
| .B SIG_BLOCK |
| The set of blocked signals is the union of the current set and the |
| .I set |
| argument. |
| .TP |
| .B SIG_UNBLOCK |
| The signals in |
| .I set |
| are removed from the current set of blocked signals. |
| It is permissible to attempt to unblock a signal which is not blocked. |
| .TP |
| .B SIG_SETMASK |
| The set of blocked signals is set to the argument |
| .IR set . |
| .PP |
| If |
| .I oldset |
| is non-NULL, the previous value of the signal mask is stored in |
| .IR oldset . |
| .PP |
| If |
| .I set |
| is NULL, then the signal mask is unchanged (i.e., |
| .I how |
| is ignored), |
| but the current value of the signal mask is nevertheless returned in |
| .I oldset |
| (if it is not NULL). |
| .PP |
| A set of functions for modifying and inspecting variables of type |
| .I sigset_t |
| ("signal sets") is described in |
| .BR sigsetops (3). |
| .PP |
| The use of |
| .BR sigprocmask () |
| is unspecified in a multithreaded process; see |
| .BR pthread_sigmask (3). |
| .SH RETURN VALUE |
| .BR sigprocmask () |
| returns 0 on success and \-1 on error. |
| In the event of an error, |
| .I errno |
| is set to indicate the cause. |
| .SH ERRORS |
| .TP |
| .B EFAULT |
| The |
| .I set |
| or |
| .I oldset |
| argument points outside the process's allocated address space. |
| .TP |
| .B EINVAL |
| Either the value specified in |
| .I how |
| was invalid or the kernel does not support the size passed in |
| .I sigsetsize. |
| .SH CONFORMING TO |
| POSIX.1-2001, POSIX.1-2008. |
| .SH NOTES |
| It is not possible to block |
| .BR SIGKILL " or " SIGSTOP . |
| Attempts to do so are silently ignored. |
| .PP |
| Each of the threads in a process has its own signal mask. |
| .PP |
| A child created via |
| .BR fork (2) |
| inherits a copy of its parent's signal mask; |
| the signal mask is preserved across |
| .BR execve (2). |
| .PP |
| If |
| .BR SIGBUS , |
| .BR SIGFPE , |
| .BR SIGILL , |
| or |
| .B SIGSEGV |
| are generated |
| while they are blocked, the result is undefined, |
| unless the signal was generated by |
| .BR kill (2), |
| .BR sigqueue (3), |
| or |
| .BR raise (3). |
| .PP |
| See |
| .BR sigsetops (3) |
| for details on manipulating signal sets. |
| .PP |
| Note that it is permissible (although not very useful) to specify both |
| .I set |
| and |
| .I oldset |
| as NULL. |
| .\" |
| .SS C library/kernel differences |
| .PP |
| The kernel's definition of |
| .IR sigset_t |
| differs in size from that used |
| by the C library. |
| In this manual page, the former is referred to as |
| .I kernel_sigset_t |
| (it is nevertheless named |
| .I sigset_t |
| in the kernel sources). |
| .PP |
| The glibc wrapper function for |
| .BR sigprocmask () |
| silently ignores attempts to block the two real-time signals that |
| are used internally by the NPTL threading implementation. |
| See |
| .BR nptl (7) |
| for details. |
| .PP |
| The original Linux system call was named |
| .BR sigprocmask (). |
| However, with the addition of real-time signals in Linux 2.2, |
| the fixed-size, 32-bit |
| .IR sigset_t |
| (referred to as |
| .IR old_kernel_sigset_t |
| in this manual page) |
| type supported by that system call was no longer fit for purpose. |
| Consequently, a new system call, |
| .BR rt_sigprocmask (), |
| was added to support an enlarged |
| .IR sigset_t |
| type |
| (referred to as |
| .IR kernel_sigset_t |
| in this manual page). |
| The new system call takes a fourth argument, |
| .IR "size_t sigsetsize" , |
| which specifies the size in bytes of the signal sets in |
| .IR set |
| and |
| .IR oldset . |
| This argument is currently required to have a fixed architecture specific value |
| (equal to |
| .IR sizeof(kernel_sigset_t) ). |
| .\" sizeof(kernel_sigset_t) == _NSIG / 8, |
| .\" which equals to 8 on most architectures, but e.g. on MIPS it's 16. |
| .PP |
| The glibc |
| .BR sigprocmask () |
| wrapper function hides these details from us, transparently calling |
| .BR rt_sigprocmask () |
| when the kernel provides it. |
| .\" |
| .SH SEE ALSO |
| .BR kill (2), |
| .BR pause (2), |
| .BR sigaction (2), |
| .BR signal (2), |
| .BR sigpending (2), |
| .BR sigsuspend (2), |
| .BR pthread_sigmask (3), |
| .BR sigqueue (3), |
| .BR sigsetops (3), |
| .BR signal (7) |