blob: 68f79d763dd552b829774b86bd62c384dd4c3841 [file] [log] [blame]
<html lang="en">
<head>
<title>Why Block - 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="next" href="Signal-Sets.html#Signal-Sets" title="Signal Sets">
<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="Why-Block"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="Signal-Sets.html#Signal-Sets">Signal Sets</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="Blocking-Signals.html#Blocking-Signals">Blocking Signals</a>
<hr>
</div>
<h4 class="subsection">24.7.1 Why Blocking Signals is Useful</h4>
<p>Temporary blocking of signals with <code>sigprocmask</code> gives you a way to
prevent interrupts during critical parts of your code. If signals
arrive in that part of the program, they are delivered later, after you
unblock them.
<p>One example where this is useful is for sharing data between a signal
handler and the rest of the program. If the type of the data is not
<code>sig_atomic_t</code> (see <a href="Atomic-Data-Access.html#Atomic-Data-Access">Atomic Data Access</a>), then the signal
handler could run when the rest of the program has only half finished
reading or writing the data. This would lead to confusing consequences.
<p>To make the program reliable, you can prevent the signal handler from
running while the rest of the program is examining or modifying that
data&mdash;by blocking the appropriate signal around the parts of the
program that touch the data.
<p>Blocking signals is also necessary when you want to perform a certain
action only if a signal has not arrived. Suppose that the handler for
the signal sets a flag of type <code>sig_atomic_t</code>; you would like to
test the flag and perform the action if the flag is not set. This is
unreliable. Suppose the signal is delivered immediately after you test
the flag, but before the consequent action: then the program will
perform the action even though the signal has arrived.
<p>The only way to test reliably for whether a signal has yet arrived is to
test while the signal is blocked.
</body></html>