#include <stdlib.h> int atexit(void (*func)());
atexit
defines a function to be called during program termination,
either as the result of a call to exit
or a return from the
main
function. The func
argument should be a function with no
arguments returning void
. Usually, atexit
routines are used
to free resources allocated by the program that are not freed
automatically by the library, such as memory allocated by direct use of
GETMAIN or DMSFREE. You can call atexit
any number of times, and
you can register the same routine more than once, in which case it is
called once for each registration.
atexit
cleanup routines are called in the opposite order of their
registration. They are called before any coprocesses are terminated or
open files are closed, but after termination of any active functions.
(Thus, a cleanup routine cannot cause execution to resume by issuing
longjmp
.) A cleanup routine can call exit
, which has no
effect other than possibly to change the exit code returned to the
operating system. In this case, no cleanup routine that was previously
called is called again.
It is not possible to deregister a function after it is registered.
However, when a load module containing a registered cleanup routine is
unloaded using unloadm
, the cleanup routine is deregistered
automatically.
It is not possible to define additional cleanup routines after program termination starts.
atexit
returns 0 if it is successful, or a non-zero value if
it is unsuccessful.
The ISO/ANSI Standard for C permits an implementation to enforce an upper limit of
32 registered functions and leaves the results undefined if a registered
function calls exit
.
atexit
and blkjmp
enable you to intercept calls to the
exit
function. You should consider the following when deciding which
function to use:
atexit
is portable and blkjmp
is not.
blkjmp
cannot intercept return from the main
function.
atexit
cannot prevent completion of exit
but blkjmp
can.
blkjmp
is used mainly for intercepting termination of an active
function, either by exit
or by longjmp
to a calling routine.
atexit
has no effect on longjmp
calls but can be used without
concern for active functions.
atexit
routine to release it because CMS leaves it allocated forever.
#include <stdlib.h> #include <stdio.h> #include <dmsfree.h> static void cleanup(); extern char *buffer; static unsigned bufsize; void getbuf(unsigned int size) { /* Allocate buffer; check for error. */ if (DMSFREE((size+7)/8, &buffer, FREE_DEF, ERR_RET)){ puts("Unable to allocate buffer."); exit(16); } /* Save buffer size. */ bufsize = (size+7)/8; /* If exit not defined, cleanup without it and quit. */ if (atexit(&cleanup) != 0) { cleanup(); exit(16); } } static void cleanup() { /* Return buffer at end of execution. */ DMSFRET(bufsize, buffer, MSG_YES, ERR_ABN); }
atcoexit
, blkjmp
, exit
Copyright (c) 1998 SAS Institute Inc. Cary, NC, USA. All rights reserved.