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) 收藏 举报
浙公网安备 33010602011771号