C 语言程序总是从 main 函数开始执行,main()函数的原型是:
int main(void)
或者
int main(int argc, char *argv[])
如果需要向应用程序传参,则选择第二种写法。不知大家是否想过“谁”调用了 main()函数?事实上, 操作系统下的应用程序在运行main()函数之前需要先执行一段引导代码,最终由这段引导代码去调用应用程序的main()函数,我们在编写应用程序的时候,不用考虑引导代码的问题,在编译链接时,由链接器将引导代码链接到我们的应用程序当中,一起构成最终的可执行文件。
然而,程序是如何结束的呢?
程序结束其实就是进程终止,进程终止的方式通常有多种,大体上分为正常终止和异常终止,正常终止包括:
1、 main()函数中通过 return 语句返回来终止进程;
2、应用程序中调用 exit()函数终止进程;
3、应用程序中调用_exit()或_Exit()终止进程;
异常终止包括:
1、应用程序中调用 abort()函数终止进程;
2、进程接收到一个信号,譬如 SIGKILL 信号。
注册进程终止处理函数 atexit()
注册进程终止处理函数 atexit()
#include <stdlib.h>
int atexit(void (*function)(void));
函数参数和返回值含义如下:
function:函数指针,指向注册的函数,此函数无需传入参数、无返回值。
返回值:成功返回 0;失败返回非 0。
测试
#include <stdio.h>
#include <stdlib.h>
static void bye(void){
puts("Goodbye!");
}
int main(int argc, char *argv[]){
if (atexit(bye)) {
fprintf(stderr, "cannot set exit function\n");
exit(-1);
}
exit(0);
}
运行结果:
需要说明的是,如果程序当中使用了_exit()或_Exit()终止进程而并非是 exit()函数,那么将不会执行注册的终止处理函数。
概念
进程其实就是一个可执行程序的实例,这句话如何理解呢?可执行程序就是一个可执行文件,文件是一个静态的概念,存放磁盘中,如果可执行