本文主要是介绍[7 进程环境]使用atexit函数注册终止处理函数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
下图显示了一个C程序是如何启动和正常关闭的:
图1 C程序是如何启动和正常关闭的
1 启动
C程序总是从main函数开始执行,内核是通过exec函数调用一个C启动例程再调用的main函数。C启动例程从内核获取命令行参数和环境变量,为调用main函数做好准备。
2 关闭
有8种方式可以使进程关闭,5种正常终止,3种异常终止。
正常终止:
(1)从main返回
(2)调用exit
(3)调用_exit或_Exit
(4)最后一个线程从C启动例程返回
(5)最后一个线程调用phtread_exit()
异常终止:
(1)调用abort
(2)接收一个信号
(3)最后一个线程对取消请求做出响应
这里先介绍两个方式。
2.1 _exit或_Exit
_exit或_Exit会立即进入内核。
2.2 exit
exit会首先条用atexit注册的终止处理函数,然后通过fclose关闭所有打开流,最后进入内核。
atexit函数:
#include <stdlib.h>
//ret:success返回0; fail返回非0
int atexit(void (*func)(void));
atexit函数注册终止处理程序,这些函数将由exit自动调用,调用的顺序与注册时顺序相反,同一函数如果注册多次也会被调用多次。一个进程最多注册32个终止处理函数。
3 使用atexit函数注册终止处理函数
#include <stdlib.h>
#include <stdio.h>static void my_exit1(void);
static void my_exit2(void);int main(void)
{if (atexit(my_exit2) != 0)printf("can't register my_exit2");if (atexit(my_exit1) != 0)printf("can't register my_exit1");if (atexit(my_exit1) != 0)printf("can't register my_exit1");printf("main is done\n");return(0);
}static void my_exit1(void)
{printf("first exit handler\n");
}static void my_exit2(void)
{printf("second exit handler\n");
}
输出:
main is done
first exit handler
first exit handler
second exit handler
调用的顺序与注册时顺序相反,同一函数如果注册多次也会被调用多次。
这篇关于[7 进程环境]使用atexit函数注册终止处理函数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!