<html lang="en">
<head>
<title>Signaling Yourself - 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="Generating-Signals.html#Generating-Signals" title="Generating Signals">
<link rel="next" href="Signaling-Another-Process.html#Signaling-Another-Process" title="Signaling Another Process">
<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="Signaling-Yourself"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="Signaling-Another-Process.html#Signaling-Another-Process">Signaling Another Process</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="Generating-Signals.html#Generating-Signals">Generating Signals</a>
<hr>
</div>

<h4 class="subsection">24.6.1 Signaling Yourself</h4>

<p>A process can send itself a signal with the <code>raise</code> function.  This
function is declared in <samp><span class="file">signal.h</span></samp>. 
<a name="index-signal_002eh-2948"></a>
<!-- signal.h -->
<!-- ISO -->

<div class="defun">
&mdash; Function: int <b>raise</b> (<var>int signum</var>)<var><a name="index-raise-2949"></a></var><br>
<blockquote><p>The <code>raise</code> function sends the signal <var>signum</var> to the calling
process.  It returns zero if successful and a nonzero value if it fails. 
About the only reason for failure would be if the value of <var>signum</var>
is invalid. 
</p></blockquote></div>

<!-- signal.h -->
<!-- SVID -->
<div class="defun">
&mdash; Function: int <b>gsignal</b> (<var>int signum</var>)<var><a name="index-gsignal-2950"></a></var><br>
<blockquote><p>The <code>gsignal</code> function does the same thing as <code>raise</code>; it is
provided only for compatibility with SVID. 
</p></blockquote></div>

   <p>One convenient use for <code>raise</code> is to reproduce the default behavior
of a signal that you have trapped.  For instance, suppose a user of your
program types the SUSP character (usually <kbd>C-z</kbd>; see <a href="Special-Characters.html#Special-Characters">Special Characters</a>) to send it an interactive stop signal
(<code>SIGTSTP</code>), and you want to clean up some internal data buffers
before stopping.  You might set this up like this:

<!-- RMS suggested getting rid of the handler for SIGCONT in this function. -->
<!-- But that would require that the handler for SIGTSTP unblock the -->
<!-- signal before doing the call to raise.  We haven't covered that -->
<!-- topic yet, and I don't want to distract from the main point of -->
<!-- the example with a digression to explain what is going on.  As -->
<!-- the example is written, the signal that is raise'd will be delivered -->
<!-- as soon as the SIGTSTP handler returns, which is fine. -->
<pre class="smallexample">     #include &lt;signal.h&gt;
     
     /* <span class="roman">When a stop signal arrives, set the action back to the default
        and then resend the signal after doing cleanup actions.</span> */
     
     void
     tstp_handler (int sig)
     {
       signal (SIGTSTP, SIG_DFL);
       /* <span class="roman">Do cleanup actions here.</span> */
       ...
       raise (SIGTSTP);
     }
     
     /* <span class="roman">When the process is continued again, restore the signal handler.</span> */
     
     void
     cont_handler (int sig)
     {
       signal (SIGCONT, cont_handler);
       signal (SIGTSTP, tstp_handler);
     }
     
     /* <span class="roman">Enable both handlers during program initialization.</span> */
     
     int
     main (void)
     {
       signal (SIGCONT, cont_handler);
       signal (SIGTSTP, tstp_handler);
       ...
     }
</pre>
   <p><strong>Portability note:</strong> <code>raise</code> was invented by the ISO&nbsp;C<!-- /@w -->
committee.  Older systems may not support it, so using <code>kill</code> may
be more portable.  See <a href="Signaling-Another-Process.html#Signaling-Another-Process">Signaling Another Process</a>.

   </body></html>

