遵循规范

POSIX.1-2001,POSIX.1-2008,C89,C99,SVr4、4.3BSD。

另外参见

_exit(2),dlopen(3),exit(3),on_exit(3)

语法

#include <stdlib.h>

int atexit(void (*function)(void));

属性

有关本节中使用的术语的说明,请参见attribute(7)。

InterfaceAttributeValue
atexit()Thread safetyMT-Safe

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

名称

atexit-注册一个在正常进程终止时要调用的函数

说明

atexit()函数注册给定的函数,以便在正常进程终止时通过exit(3)或从程序的main()返回来调用该函数。如此注册的功能以其注册的相反顺序调用。没有传递参数。

相同的功能可能会多次注册:每次注册都会调用一次。

POSIX.1要求实现至少允许注册ATEXIT_MAX(32)这样的功能。一个实现支持的实际限制可以使用sysconf(3)获得。

通过fork(2)创建子进程时,它将继承其父级注册的副本。成功调用exec(3)函数之一后,将删除所有注册。

返回值

如果成功,则atexit()函数返回值0;否则,返回0。否则返回非零值。

示例

#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);
}
ATEXIT - Linux手册页

Linux程序员手册 第3部分
更新日期: 2020-06-09

备注

如果进程由于传递信号而异常终止,则不会调用使用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))来建立在卸载共享库时调用的函数。

日期:2019-08-20 17:59:54 来源:oir作者:oir