74 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			74 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			C
		
	
	
	
| /*
 | |
|  * Copyright (c) 1990 Regents of the University of California.
 | |
|  * All rights reserved.
 | |
|  *
 | |
|  * %sccs.include.redist.c%
 | |
|  *
 | |
|  * This function is a modified version of atexit.c
 | |
|  */
 | |
| 
 | |
| /*
 | |
| FUNCTION
 | |
| <<on_exit>>---request execution of function with argument at program exit
 | |
| 
 | |
| INDEX
 | |
| 	on_exit
 | |
| 
 | |
| SYNOPSIS
 | |
| 	#include <stdlib.h>
 | |
| 	int on_exit (void (*<[function]>)(int, void *), void *<[arg]>);
 | |
| 
 | |
| DESCRIPTION
 | |
| You can use <<on_exit>> to enroll functions in a list of functions that
 | |
| will be called when your program terminates normally.  The argument is
 | |
| a pointer to a user-defined function which takes two arguments.  The
 | |
| first is the status code passed to exit and the second argument is of type
 | |
| pointer to void.  The function must not return a result.  The value
 | |
| of <[arg]> is registered and passed as the argument to <[function]>.
 | |
| 
 | |
| The functions are kept in a LIFO stack; that is, the last function
 | |
| enrolled by <<atexit>> or <<on_exit>> will be the first to execute when 
 | |
| your program exits.  You can intermix functions using <<atexit>> and
 | |
| <<on_exit>>.
 | |
| 
 | |
| There is no built-in limit to the number of functions you can enroll
 | |
| in this list; however, after every group of 32 functions is enrolled,
 | |
| <<atexit>>/<<on_exit>> will call <<malloc>> to get space for the next part 
 | |
| of the list.   The initial list of 32 functions is statically allocated, so
 | |
| you can always count on at least that many slots available.
 | |
| 
 | |
| RETURNS
 | |
| <<on_exit>> returns <<0>> if it succeeds in enrolling your function,
 | |
| <<-1>> if it fails (possible only if no space was available for
 | |
| <<malloc>> to extend the list of functions).
 | |
| 
 | |
| PORTABILITY
 | |
| <<on_exit>> is a non-standard glibc extension
 | |
| 
 | |
| Supporting OS subroutines required: None
 | |
| */
 | |
| 
 | |
| #include <stddef.h>
 | |
| #include <stdlib.h>
 | |
| #include "atexit.h"
 | |
| 
 | |
| #ifdef _REENT_SMALL
 | |
| 
 | |
| #include "on_exit_args.h"
 | |
| 
 | |
| /* force linking of static instance of _on_exit_args */
 | |
| const void * const __on_exit_dummy = &__on_exit_args;
 | |
| 
 | |
| #endif	/* def _REENT_SMALL */
 | |
| 
 | |
| /*
 | |
|  * Register a function to be performed at exit.
 | |
|  */
 | |
| 
 | |
| int
 | |
| on_exit (void (*fn) (int, void *),
 | |
|         void *arg)
 | |
| {
 | |
|   return __register_exitproc (__et_onexit, (void (*)(void)) fn, arg, NULL);
 | |
| }
 |