foggia2004

atexit函数

使用该函数注册的退出函数是在进程正常退出时,才会被调用.这里强调是进程正常退出,使用exit退出或使用main中最后的return语句退出.但如果是因为收到信号signal而导致程序退出,如kill pid,那么atexit所注册的函数将不会被调用.
而当进程收到信号时,如果没有注册函数去处理对应的信号,那么内核就会执行信号的默认动作,一般就是直接终止进程.这个时候,进程的退出完全由内核来完成,自然就不会调用到C库的exit函数了,从而也就无法调用注册的退出函数了.

下面是一个atexit的例子--进程正常退出

 1 void callback2(void)
 2 {
 3     printf("i am callback2!\n");
 4 }
 5 
 6 void callback1(void)
 7 {
 8     printf("i am callback1!\n");
 9 }
10 
11 int main(int argc, char *argv[])
12 {
13     atexit(callback1);
14     atexit(callback2);
15     /* while(1);
16      * 如果在这之间加入代码while(1);让进程不自己退出,而等待其他信号退出,那么就不会执行atexit了
17      */
18     printf("main exit!\n");
19     return 0;
20 }

运行截图

 

进程异常终止退出情况

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之前注册的函数

posted on 2016-12-29 10:48  foggia2004  阅读(212)  评论(0)    收藏  举报

导航