程序退出处理函数----atexit()
2013-03-03 18:24
260 查看
欢迎转载,请注明出处,本文地址: 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;
}
联系邮箱: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;
}
相关文章推荐
- 程序退出时的必要处理之atexit()函数
- atexit函数:注册终止处理程序
- 进程退出(exit)处理函数 atexit
- 碰到bind错误,主程序异常,调用处理函数退出问题
- 用atexit()处理C/C++程序的退出
- MFC程序中消息以及函数的处理顺序
- atexit终止处理函数
- jquery delegate() 方法为指定的元素(属于被选元素的子元素)添加一个或多个事件处理程序,并规定当这些事件发生时运行的函数
- 关于中断处理程序中的关中断函数disable_irq和disable_irq_nosync
- 0805编写一个程序,实现同一个信号处理函数对多个信号的处理
- 多线程程序设计时,程序退出时的处理方式
- AnimateWindow 函数 程序退出动画效果
- 退出程序监听函数
- Android 重写系统Crash处理类,保存Crash信息到SD卡 和 完美退出程序的方法
- Android按返回键退出程序但不销毁,程序后台运行,同QQ退出处理方式
- 在程序退出main()函数之后,还有可能执行一部分代码吗?
- 几个出错处理的函数abort、exit、atexit、strerror函数的使用方法
- Python的信号处理与程序退出
- CrashHandler--程序异常退出处理
- 托盘程序的实现(delphi的消息处理函数)