程序是从main主函数开始运行吗?

   很多人开始学计算机语言,编写代码时都会有一个疑问:程序真的是从main主函数开始的吗?之前什么都不做吗?main结束后就不能执行其他函数了吗?下面本篇文章就为此问题做一个简单的解释。
   操作系统在装载程序之后,首先运行的不是main程序的第一行,在执行mian主函数之前其实还有一些别的代码需要执行,这些代码负责准备main主函数执行所需要的一些环境,并且负责调用main主函数,在main函数返回后,会记录main函数的返回值,调用atexit()函数,然后结束进程。运行这些代码的函数称为入口函数或入口点,一个程序的入口点实际上是一个程序的初始化和结束部分,一个典型的程序运行步骤大致如下:
   1、操作系统在创建进程后,把控制权交给了程序的入口,这个入口就是运行库中的某个入口函数。
   2、入口函数对运行库和程序运行环境作初始化,包括堆,线程全局变量的构造。
   3、入口函数在完成初始化之后,调用main()开始执行
   4、main函数执行完成后返回到入口函数,然后入口函数进行清理工作,然后进行系统调用结束进程。
  
 1、下面举例一个代码:
    #include
 
    int a=3;
    int main(int argc,char* argv[])
    {
       printf("hello world");
       return 0;
     }
例如上面那个程序,在main函数第一行执行之前全局变量的初始化已经完成了,main函数参数也传了进来
2、atexit函数也是在main函数返回后调用
atexit()注册的函数类型应为不接受任何参数的void函数,exit调用这些注册函数的顺序与它们 登记时候的顺序相反。同一个函数如若登记多次,则也会被调用多次。如果一个进程被信号所中断,那由atexit()函数注册的终止处理程序不会被调用.
 
  程序例:
 
  #include
       #include < stdlib.h>
 
  void exit_fn1(void)
    {
  printf("Exit function #1 called\n");
    }
  void exit_fn2(void)
 {
  printf("Exit function #2 called\n");
  }
 
  int main(void)
    {
  /* post exit function #1 */
  atexit(exit_fn1);
  /* post exit function #2 */
  atexit(exit_fn2);
 
  return 0;
 }
     输出:
  Exit function #2 called
  Exit function #1 called

main主函数的参数:

Int main(int argc  , char *argv[],char* envp[])

 

        传参个数 参数列表  环境变量

主函数默认接收一个参数:就是所执行的命令,所传参数以空格键区分,若要传字符串可以用双引号和转义字符连接


文章材料来源于《程序员的自我修养》
此博客部分内容  http://www.cnblogs.com/wanghetao/archive/2012/04/03/2431256.html

你可能感兴趣的:(程序是从main主函数开始运行吗?)