之前几次的面试经历中好几次面试官都问过程序运行时在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"); }
   |