atexit函数
使用该函数注册的退出函数是在进程正常退出时,才会被调用.这里强调是进程正常退出,使用exit退出或使用main中最后的return语句退出.但如果是因为收到信号signal而导致程序退出,如kill pid,那么atexit所注册的函数将不会被调用.
而当进程收到信号时,如果没有注册函数去处理对应的信号,那么内核就会执行信号的默认动作,一般就是直接终止进程.这个时候,进程的退出完全由内核来完成,自然就不会调用到C库的exit函数了,从而也就无法调用注册的退出函数了.
下面是一个atexit的例子--进程正常退出
void callback2(void)
{
printf("i am callback2!\n");
} void callback1(void)
{
printf("i am callback1!\n");
} int main(int argc, char *argv[])
{
atexit(callback1);
atexit(callback2);
/* while(1);
* 如果在这之间加入代码while(1);让进程不自己退出,而等待其他信号退出,那么就不会执行atexit了
*/
printf("main exit!\n");
return ;
}
运行截图

进程异常终止退出情况
void callback2(void)
{
printf("i am callback2!\n");
} void callback1(void)
{
printf("i am callback1!\n");
} int main(int argc, char *argv[])
{
atexit(callback1);
atexit(callback2);
while(1); /* 等待终止信号,如kill */
printf("main exit!\n");
return 0;
}
运行截图
查询进程的pid

执行命令 kill 6848

atexit进程被kill终止,就没有执行atexit之前注册的函数
atexit函数的更多相关文章
- atexit函数和两种特殊文件权限位
atexit函数 atexit函数的原型如下 void atexit(void (*func)(void)) 它是一个参数为返回值和参数均为空的函数指针的函数,含义是当前进程结束之前执行参数函数指针所 ...
- C/C++程序终止时执行的函数——atexit()函数详解
很多时候我们需要在程序退出的时候做一些诸如释放资源的操作,但程序退出的方式有很多种,比如main()函数运行结束.在程序的某个地方用exit()结束程序.用户通过Ctrl+C或Ctrl+break操作 ...
- atexit()函数
atexit()函数 头文件:#include<stdlib.h> 功 能: 注册终止函数(即main执行结束后调用的函数) 用 法: int atexit(void (*func)(v ...
- 回收进程用户空间资源 exit()函数 _exit()函数 atexit()函数 on_exit()函数
摘要:本文主要讲述进程的终止方式,以及怎样使用exit()函数来终止进程.回收进程用户空间资源:分析了exit()函数与_exit()函数,returnkeyword的差异.同一时候具体解读了怎样使用 ...
- atexit函数和exit函数的理解
按照ISO C的规定,一个进程可以登记多达32个函数,这些函数将由exit自动调用,通常这32个函数被称为终止处理程序,并调用atexit函数来登记这些函数. 我们通常认为C语言的起始函数是main函 ...
- atexit函数详解
对C语言有所了解的人都知道main函数是整个程序的入口,但是其实不然,在内核中可以使用链接器来设置程序的开始地方.当内核使⽤⼀个exec函数执⾏C程序时,在调⽤main函数之前先调⽤⼀个特殊的启动例程 ...
- linux系统编程之进程(四):进程退出exit,_exit区别即atexit函数(转载)
一,进程终止有5种方式: 正常退出: 从main函数返回 调用exit 调用_exit 异常退出: 调用abort 由信号终止 二,exit和_exit区别: 关于_exit(): #include ...
- atexit函数学习
函数名: atexit 头文件:#include<stdlib.h> 功 能: 注册终止函数(即main执行结束后调用的函数) 用 法: void atexit(void (*func)( ...
- atexit函数的使用【学习笔记】
#include "apue.h" static void my_exit1(void); static void my_exit2(void); int main(void) { ...
随机推荐
- mybatis动态切换数据源
(#)背景:由于业务的需求,导致需要随时切换15个数据源,此时不能low逼的去写十几个mapper,所以想到了实现一个数据源的动态切换 首先要想重写多数据源,那么你应该理解数据源的一个概念是什么,Da ...
- 把excel导入的自定义时间改成yyyyMMdd
public static String changeCellToString(XSSFCell cell){ String result = "";// Object value ...
- 转:深入浅出UML类图(具体到代码层次)
深入浅出UML类图 作者:刘伟 ,发布于:2012-11-23,来源:CSDN 在UML 2.0的13种图形中,类图是使用频率最高的UML图之一.Martin Fowler在其著作<UML ...
- SQLite 事务
SQLite数据库是支持事务的,事务的特性可以保证让一系列的操作要么全部完成要么一个都不会完成. 一.调用SQLDatabase的beginTransaction()开起一个事务,当事务处理完成,调用 ...
- centos7
1.启用Apache(httpd) Centos7默认已经安装httpd服务,只是没有启动.如果你需要全新安装,可以yum install -y httpd 启动服务:systemctl start ...
- flask笔记1-安装
1.创建应用的根目录: 2.在根目录下创建独立的虚拟python运行环境,创建完成后当前目录会有一个文件夹,即该独立环境(使用--no-site-pachages参数将不会复制任何系统python环境 ...
- 2015-01-19 .Net 软件工程师 笔试题
填空题 1.String是__类型(值类型或引用类型) 2.int的基类是__ 3.实现__的类,可以应用foreach语句 4.要输出一段XML文档,用__类来实现能够确保输出正确格式的XML,输出 ...
- android .9图的作用
参考:http://www.cnblogs.com/lianghui66/archive/2013/01/08/2850581.html .9图的介绍 1.这种格式的图片是Android平台上一种被拉 ...
- jqueryGannt用法
jqueryGannt主要用于甘特图的展示,直接上步骤 1.下载 jquery.min.js js/jquery.fn.gantt.js 的js ,可以自己去github上搜官方的. 其他的要上传对应 ...
- 用Object字面量来代替swtich/if...else
很多时候,if...else...有很多判断分支选项,就会见到: if (animal === 'dog') { // TO DO 'dog' } else if (animal === 'cat') ...