欢迎转载,请注明出处,本文地址: http://blog.csdn.net/jk050802/article/details/8631333
联系邮箱:yinfork@foxmail.com
函数原型:
*#include <stdlib.h>
*intatexit(void (*func) (void));
作用:
用来登记程序退出时,需要调用的函数。在程序退出时,以最后登记的函数最先执行的顺序,执行登记过的函数。
说明:
1. 该函数的参数为一个函数地址;
2. 按照ISO C规定,至少可以登记32个函数;
3. 从该函数所属于的库看出,这个函数不止linux适用,大多操作系统也能使用;
4. 不同的退出函数,atexit登记的函数的执行情况是不同的。
实际测试:
测试环境:Fedora10 + gcc 4.3.2
并不是所以的退出函数都会执行到atexit登记的函数。下面是采用不同退出函数时,atexit所执行的情况。设登记的退出函数的顺序为atexit1, atexit1, atexit2。
1) 以exit (0) 或 return 0 退出时,终端显示正常退出,可以执行到atexit登记的函数
输出结果:
[root@localhost atexit]# ./test
main has done
atexit2
atexit1
atexit1
2) 以abort() 退出时,终端显示异常退出,不可以执行到atexit登记的函数
输出结果:
[root@localhostatexit]# ./test
main has done
已放弃
3) 以_exit(0) 或_Exit(0)退出时,终端显示正常退出,但不可以执行到atexit登记的函数
输出结果:
[root@localhost atexit]# ./test
main has done
4) 以assert(0)退出时,终端显示异常退出,不可以执行到atexit登记的函数
输出结果:
[root@localhost atexit]# ./test
main has done
test: atexit.c:38: main: Assertion `0' failed.
已放弃
测试代码:
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
/***************************************************
*#include<stdlib.h>
*intatexit(void (*func) (void));
*
*return vaule:if success return 0.eles returnnot 0
***************************************************/
static void atexit1(void);
static void atexit2(void);
static void atexit1(void)
{
printf("atexit1\n");
}
static void atexit2(void)
{
printf("atexit2\n");
}
int main(void)
{
if(atexit(atexit1) != 0)
printf("can'tatexit1\n");
if(atexit(atexit1) != 0)
printf("can'tatexit1\n");
if(atexit(atexit2) != 0)
printf("can'tatexit2\n");
printf("main has done\n");
// abort();
// assert(0);
// _exit(0);
exit(0);
// return 0;
}