blob: 684fae201f30c3fa9646c2967ffe9a84f0ffbc9c [file] [log] [blame]
<html lang="en">
<head>
<title>Cleanups on Exit - 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="Program-Termination.html#Program-Termination" title="Program Termination">
<link rel="prev" href="Exit-Status.html#Exit-Status" title="Exit Status">
<link rel="next" href="Aborting-a-Program.html#Aborting-a-Program" title="Aborting a Program">
<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="Cleanups-on-Exit"></a>
<p>
Next:&nbsp;<a rel="next" accesskey="n" href="Aborting-a-Program.html#Aborting-a-Program">Aborting a Program</a>,
Previous:&nbsp;<a rel="previous" accesskey="p" href="Exit-Status.html#Exit-Status">Exit Status</a>,
Up:&nbsp;<a rel="up" accesskey="u" href="Program-Termination.html#Program-Termination">Program Termination</a>
<hr>
</div>
<h4 class="subsection">25.6.3 Cleanups on Exit</h4>
<p>Your program can arrange to run its own cleanup functions if normal
termination happens. If you are writing a library for use in various
application programs, then it is unreliable to insist that all
applications call the library's cleanup functions explicitly before
exiting. It is much more robust to make the cleanup invisible to the
application, by setting up a cleanup function in the library itself
using <code>atexit</code> or <code>on_exit</code>.
<!-- stdlib.h -->
<!-- ISO -->
<div class="defun">
&mdash; Function: int <b>atexit</b> (<var>void </var>(<var>*function</var>) (<var>void</var>))<var><a name="index-atexit-3139"></a></var><br>
<blockquote><p>The <code>atexit</code> function registers the function <var>function</var> to be
called at normal program termination. The <var>function</var> is called with
no arguments.
<p>The return value from <code>atexit</code> is zero on success and nonzero if
the function cannot be registered.
</p></blockquote></div>
<!-- stdlib.h -->
<!-- SunOS -->
<div class="defun">
&mdash; Function: int <b>on_exit</b> (<var>void </var>(<var>*function</var>)(<var>int status, void *arg</var>)<var>, void *arg</var>)<var><a name="index-on_005fexit-3140"></a></var><br>
<blockquote><p>This function is a somewhat more powerful variant of <code>atexit</code>. It
accepts two arguments, a function <var>function</var> and an arbitrary
pointer <var>arg</var>. At normal program termination, the <var>function</var> is
called with two arguments: the <var>status</var> value passed to <code>exit</code>,
and the <var>arg</var>.
<p>This function is included in the GNU C library only for compatibility
for SunOS, and may not be supported by other implementations.
</p></blockquote></div>
<p>Here's a trivial program that illustrates the use of <code>exit</code> and
<code>atexit</code>:
<pre class="smallexample"> #include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
void
bye (void)
{
puts ("Goodbye, cruel world....");
}
int
main (void)
{
atexit (bye);
exit (EXIT_SUCCESS);
}
</pre>
<p class="noindent">When this program is executed, it just prints the message and exits.
</body></html>