| <html lang="en"> |
| <head> |
| <title>Process Signal Mask - The GNU C Library</title> |
| <meta http-equiv="Content-Type" content="text/html"> |
| <meta name="description" content="The GNU C Library"> |
| <meta name="generator" content="makeinfo 4.13"> |
| <link title="Top" rel="start" href="index.html#Top"> |
| <link rel="up" href="Blocking-Signals.html#Blocking-Signals" title="Blocking Signals"> |
| <link rel="prev" href="Signal-Sets.html#Signal-Sets" title="Signal Sets"> |
| <link rel="next" href="Testing-for-Delivery.html#Testing-for-Delivery" title="Testing for Delivery"> |
| <link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage"> |
| <!-- |
| This file documents the GNU C library. |
| |
| This is Edition 0.12, last updated 2007-10-27, |
| of `The GNU C Library Reference Manual', for version |
| 2.8 (Sourcery G++ Lite 2011.03-41). |
| |
| Copyright (C) 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2001, 2002, |
| 2003, 2007, 2008, 2010 Free Software Foundation, Inc. |
| |
| Permission is granted to copy, distribute and/or modify this document |
| under the terms of the GNU Free Documentation License, Version 1.3 or |
| any later version published by the Free Software Foundation; with the |
| Invariant Sections being ``Free Software Needs Free Documentation'' |
| and ``GNU Lesser General Public License'', the Front-Cover texts being |
| ``A GNU Manual'', and with the Back-Cover Texts as in (a) below. A |
| copy of the license is included in the section entitled "GNU Free |
| Documentation License". |
| |
| (a) The FSF's Back-Cover Text is: ``You have the freedom to |
| copy and modify this GNU manual. Buying copies from the FSF |
| supports it in developing GNU and promoting software freedom.''--> |
| <meta http-equiv="Content-Style-Type" content="text/css"> |
| <style type="text/css"><!-- |
| pre.display { font-family:inherit } |
| pre.format { font-family:inherit } |
| pre.smalldisplay { font-family:inherit; font-size:smaller } |
| pre.smallformat { font-family:inherit; font-size:smaller } |
| pre.smallexample { font-size:smaller } |
| pre.smalllisp { font-size:smaller } |
| span.sc { font-variant:small-caps } |
| span.roman { font-family:serif; font-weight:normal; } |
| span.sansserif { font-family:sans-serif; font-weight:normal; } |
| --></style> |
| <link rel="stylesheet" type="text/css" href="../cs.css"> |
| </head> |
| <body> |
| <div class="node"> |
| <a name="Process-Signal-Mask"></a> |
| <p> |
| Next: <a rel="next" accesskey="n" href="Testing-for-Delivery.html#Testing-for-Delivery">Testing for Delivery</a>, |
| Previous: <a rel="previous" accesskey="p" href="Signal-Sets.html#Signal-Sets">Signal Sets</a>, |
| Up: <a rel="up" accesskey="u" href="Blocking-Signals.html#Blocking-Signals">Blocking Signals</a> |
| <hr> |
| </div> |
| |
| <h4 class="subsection">24.7.3 Process Signal Mask</h4> |
| |
| <p><a name="index-signal-mask-2965"></a><a name="index-process-signal-mask-2966"></a> |
| The collection of signals that are currently blocked is called the |
| <dfn>signal mask</dfn>. Each process has its own signal mask. When you |
| create a new process (see <a href="Creating-a-Process.html#Creating-a-Process">Creating a Process</a>), it inherits its |
| parent's mask. You can block or unblock signals with total flexibility |
| by modifying the signal mask. |
| |
| <p>The prototype for the <code>sigprocmask</code> function is in <samp><span class="file">signal.h</span></samp>. |
| <a name="index-signal_002eh-2967"></a> |
| Note that you must not use <code>sigprocmask</code> in multi-threaded processes, |
| because each thread has its own signal mask and there is no single process |
| signal mask. According to POSIX, the behavior of <code>sigprocmask</code> in a |
| multi-threaded process is “unspecified”. |
| Instead, use <code>pthread_sigmask</code>. |
| |
| <!-- signal.h --> |
| <!-- POSIX.1 --> |
| <div class="defun"> |
| — Function: int <b>sigprocmask</b> (<var>int how, const sigset_t *restrict set, sigset_t *restrict oldset</var>)<var><a name="index-sigprocmask-2968"></a></var><br> |
| <blockquote><p>The <code>sigprocmask</code> function is used to examine or change the calling |
| process's signal mask. The <var>how</var> argument determines how the signal |
| mask is changed, and must be one of the following values: |
| |
| <dl> |
| <!-- signal.h --> |
| <!-- POSIX.1 --> |
| <a name="index-SIG_005fBLOCK-2969"></a><dt><code>SIG_BLOCK</code><dd>Block the signals in <code>set</code>—add them to the existing mask. In |
| other words, the new mask is the union of the existing mask and |
| <var>set</var>. |
| |
| <!-- signal.h --> |
| <!-- POSIX.1 --> |
| <p><a name="index-SIG_005fUNBLOCK-2970"></a><br><dt><code>SIG_UNBLOCK</code><dd>Unblock the signals in <var>set</var>—remove them from the existing mask. |
| |
| <!-- signal.h --> |
| <!-- POSIX.1 --> |
| <p><a name="index-SIG_005fSETMASK-2971"></a><br><dt><code>SIG_SETMASK</code><dd>Use <var>set</var> for the mask; ignore the previous value of the mask. |
| </dl> |
| |
| <p>The last argument, <var>oldset</var>, is used to return information about the |
| old process signal mask. If you just want to change the mask without |
| looking at it, pass a null pointer as the <var>oldset</var> argument. |
| Similarly, if you want to know what's in the mask without changing it, |
| pass a null pointer for <var>set</var> (in this case the <var>how</var> argument |
| is not significant). The <var>oldset</var> argument is often used to |
| remember the previous signal mask in order to restore it later. (Since |
| the signal mask is inherited over <code>fork</code> and <code>exec</code> calls, you |
| can't predict what its contents are when your program starts running.) |
| |
| <p>If invoking <code>sigprocmask</code> causes any pending signals to be |
| unblocked, at least one of those signals is delivered to the process |
| before <code>sigprocmask</code> returns. The order in which pending signals |
| are delivered is not specified, but you can control the order explicitly |
| by making multiple <code>sigprocmask</code> calls to unblock various signals |
| one at a time. |
| |
| <p>The <code>sigprocmask</code> function returns <code>0</code> if successful, and <code>-1</code> |
| to indicate an error. The following <code>errno</code> error conditions are |
| defined for this function: |
| |
| <dl> |
| <dt><code>EINVAL</code><dd>The <var>how</var> argument is invalid. |
| </dl> |
| |
| <p>You can't block the <code>SIGKILL</code> and <code>SIGSTOP</code> signals, but |
| if the signal set includes these, <code>sigprocmask</code> just ignores |
| them instead of returning an error status. |
| |
| <p>Remember, too, that blocking program error signals such as <code>SIGFPE</code> |
| leads to undesirable results for signals generated by an actual program |
| error (as opposed to signals sent with <code>raise</code> or <code>kill</code>). |
| This is because your program may be too broken to be able to continue |
| executing to a point where the signal is unblocked again. |
| See <a href="Program-Error-Signals.html#Program-Error-Signals">Program Error Signals</a>. |
| </p></blockquote></div> |
| |
| </body></html> |
| |