ATEXIT - Linux手册页
Linux程序员手册 第3部分
更新日期: 2020-06-09
名称
atexit-注册一个在正常进程终止时要调用的函数
语法
#include <stdlib.h> int atexit(void (*function)(void));
说明
atexit()函数注册给定的函数,以便在正常进程终止时通过exit(3)或从程序的main()返回来调用该函数。如此注册的功能以其注册的相反顺序调用。没有传递参数。
相同的功能可能会多次注册:每次注册都会调用一次。
POSIX.1要求实现至少允许注册ATEXIT_MAX(32)这样的功能。一个实现支持的实际限制可以使用sysconf(3)获得。
返回值
如果成功,则atexit()函数返回值0;否则,返回0。否则返回非零值。
属性
有关本节中使用的术语的说明,请参见attribute(7)。
Interface | Attribute | Value |
atexit() | Thread safety | MT-Safe |
遵循规范
POSIX.1-2001,POSIX.1-2008,C89,C99,SVr4、4.3BSD。
备注
如果进程由于传递信号而异常终止,则不会调用使用atexit()(和on_exit(3))注册的函数。
如果其中一个已注册函数调用_exit(2),则不会调用任何剩余函数,并且不会执行由exit(3)执行的其他进程终止步骤。
POSIX.1说多次调用exit(3)的结果(即在使用atexit()注册的函数中调用exit(3))的结果是不确定的。在某些系统上(但不是Linux),这可能导致无限递归。可移植程序不应在使用atexit()注册的函数内调用exit(3)。
atexit()和on_exit(3)函数将函数注册在同一列表上:在正常进程终止时,这两个函数以与注册相反的顺序调用已注册的函数。
根据POSIX.1,如果使用longjmp(3)终止执行通过atexit()注册的功能之一,则结果不确定。
Linux notes
从glibc 2.2.3开始,可以在共享库中使用atexit()(和on_exit(3))来建立在卸载共享库时调用的函数。
示例
#include <stdio.h> #include <stdlib.h> #include <unistd.h> void bye(void) { printf("That was all, folks\n"); } int main(void) { long a; int i; a = sysconf(_SC_ATEXIT_MAX); printf("ATEXIT_MAX = %ld\n", a); i = atexit(bye); if (i != 0) { fprintf(stderr, "cannot set exit function\n"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); }
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。