之前几次的面试经历中好几次面试官都问过程序运行时在main函数之前发生了些什么。 笔者大概知道是做一些初始化相关的事情,今日详细mark一下。
main函数执行之前,主要就是初始化系统相关资源:
1.设置栈指针
2.初始化static静态和global全局变量,即data段的内容
3.将未初始化部分的赋初值:数值型short,int,long等为0,bool为FALSE,指针为NULL,等等,即.bss段的内容
4.运行全局构造器,估计是C++中构造函数之类的吧
5.将main函数的参数,argc,argv等传递给main函数,然后才真正运行main函数
同样地,main函数结束之后就是一些资源释放的事情,以及调用之前注册的终止处理程序等等。
附上一段apue上注册终止程序的demo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| #include "apue.h" static void my_exit1(void); static void my_exit2(void); int main(void) { if(atexit(my_exit2) != 0){ err_sys("can't register my_exit2"); }
if(atexit(my_exit1) != 0){ err_sys("can't register my_exit1"); }
if(atexit(my_exit1) != 0){ err_sys("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"); }
|