摘要:本文描述的是Linux手册页中atexit()函数的使用说明,使用atexit()函数注册终止处理程序.原文来自:http://www.kernel.org/doc/man-pages/.
NAME
atexit - 用来注册执行exit()函数前执行的终止处理程序.
SYNOPSIS
#include <stdlib.h>
int atexit(void (*function)(void));
DESCRIPTION
atexit()用来注册终止处理程序,当程序通过调用exit()或从main 中返回时被调用.终止处理程序执行的顺序和注册时的顺序是相反的,终止处理程序没有参数传递.同一个函数若注册多次,那它也会被调用多次.按POSIX.1-2001规定,至少可以注册32个终止处理程序,若想查看实际可以注册多少个终止处理程序,可以通过调用sysconf()函数获得.
当一个子进程是通过调用fork()函数产生时,它将继承父进程的所有终止处理程序.在成功调用exec系列函数后,所有的终止处理程序都会被删除.
RETURN VALUE
成功返回0,失败返回非0值.
CONFORMING TO
SVr4, 4.3BSD, C89, C99, POSIX.1-2001.
NOTES
如果一个进程被信号所中断,那由atexit()函数注册的终止处理程序不会被调用.
如果在其中一个终止处理程序中调用了_exit()函数;那剩余的终止处理程序将不会得到调用,同时由exit()函数调用的其他终止进程步骤也将不会执行.
在POSIX.1-2001标准中,在终止进程过程中,在终止处理程序中,不只一次的调用exit()函数,这样导致的结果是未定义的.在某些系统中,这样的调用将会导致递归死循环.可移植的程序不应该在终止处理程序中调用exit()函数.
函数atexit()和on_exit()在注册终止程序时,有一样的列表.在进程正常退出时执行终止处理程序,调用的顺序刚好与注册时相反.
按POSIX.1-2001的规定,如果在终止处理程序中调用longjmp()函数,这样导致的结果是未定义的.
Linux notes
自glibc2.2.3版本后,atexit()和on_exit()函数能够使用在共享库建立的函数,当共享库卸载时被调用.
EXAMPLE
#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);
}
END
NAME
atexit - 用来注册执行exit()函数前执行的终止处理程序.
SYNOPSIS
#include <stdlib.h>
int atexit(void (*function)(void));
DESCRIPTION
atexit()用来注册终止处理程序,当程序通过调用exit()或从main 中返回时被调用.终止处理程序执行的顺序和注册时的顺序是相反的,终止处理程序没有参数传递.同一个函数若注册多次,那它也会被调用多次.按POSIX.1-2001规定,至少可以注册32个终止处理程序,若想查看实际可以注册多少个终止处理程序,可以通过调用sysconf()函数获得.
当一个子进程是通过调用fork()函数产生时,它将继承父进程的所有终止处理程序.在成功调用exec系列函数后,所有的终止处理程序都会被删除.
RETURN VALUE
成功返回0,失败返回非0值.
CONFORMING TO
SVr4, 4.3BSD, C89, C99, POSIX.1-2001.
NOTES
如果一个进程被信号所中断,那由atexit()函数注册的终止处理程序不会被调用.
如果在其中一个终止处理程序中调用了_exit()函数;那剩余的终止处理程序将不会得到调用,同时由exit()函数调用的其他终止进程步骤也将不会执行.
在POSIX.1-2001标准中,在终止进程过程中,在终止处理程序中,不只一次的调用exit()函数,这样导致的结果是未定义的.在某些系统中,这样的调用将会导致递归死循环.可移植的程序不应该在终止处理程序中调用exit()函数.
函数atexit()和on_exit()在注册终止程序时,有一样的列表.在进程正常退出时执行终止处理程序,调用的顺序刚好与注册时相反.
按POSIX.1-2001的规定,如果在终止处理程序中调用longjmp()函数,这样导致的结果是未定义的.
Linux notes
自glibc2.2.3版本后,atexit()和on_exit()函数能够使用在共享库建立的函数,当共享库卸载时被调用.
EXAMPLE
#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);
}
END
笔者:个人能力有限,只是学习参考...读者若发现文中错误,敬请提出.
--
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------勿在浮沙筑高台,静下心来,慢慢地沉淀---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------