能够参考《程序员的自我修养》装载、连接和库linux
一、程序并非从main函数开始的。好比下面的程序:程序员
#include <stdio.h> #include <stdlib.h> int a = 3; int main(int argc, char *argv[]) { int *p = (int *)malloc(sizeof(int)); scanf("%d", p); printf("%d", a + *p); free(p); } #include <string> using namespace std; string v; double foo() { return 1.0; } double g = foo(); int main() {}
从代码中咱们能够看到,在程序刚刚执行到main的时候,全局变量的初始化过程已经结束了(a的值已经肯定),main函数的两个参数(argc和argv)也被正确传了进来。此外,在你不知道的时候,堆和栈的初始化悄悄地完成了,一些系统I/O也被初始化了,所以能够放心地使用printf和malloc。函数
第二个C++程序,对象v的构造函数,以及用于初始化全局变量g的函数foo都会在main以前调用。spa
操做系统装载程序以后,首先运行的代码并非main的第一行,而是某些别的代码,这些代码负责准备好main函数执行所须要的环境,而且负责调用main函数,这时候你才能够在main函数里放心大胆地写各类代码:申请内存、使用系统调用、触发异常、访问I/O。在main返回以后,它会记录main函数的返回值,调用atexit注册的函数,而后结束进程。操作系统
运行这些代码的函数成为入口函数或入口点,视平台的不一样而有不一样的名字。程序的入口点其实是一个程序的初始化和结束部分,它每每是运行库的一部分。一个典型的程序运行步骤大体以下:线程
(1)操做系统在建立进程后,把控制权交到了程序的入口,这个入口每每是运行库中的某个入口函数。对象
(2)入口函数对运行库和程序运行环境进行初始化,包括堆、I/O、线程、全局变量构造,等等blog
(3)入口函数在完成初始化以后,调用main函数,正式开始执行程序主题部分。进程
(4)main函数执行完毕之后,返回到入口函数,入口函数进行清理工做,包括全局变量析构、堆销毁、关闭I/O等,而后进行系统调用结束进程。内存