Linux进程全解1——程序的开始、结束

来源:互联网 发布:mcmore php 编辑:程序博客网 时间:2024/06/05 15:39

以下内容源于朱有鹏《物联网大讲堂》课程的学习整理,如有侵权,请告知删除。


1、main函数由谁调用?

(1)编译链接时的引导代码

  • 操作系统下的应用程序,在main函数执行前,需要先执行一段引导代码(作用,如构建c语言环境);
  • 写应用程序时,不用考虑引导代码的问题,因为自带的;
  • 链接时,由链接器将编译器中事先准备好的引导代码给连接进去,和应用程序一起构成最终的可执行程序。

(2)运行时的加载器

  • 加载器是操作系统中的程序,当执行一个程序时(譬如./a.out,譬如在代码中用exec族函数来运行),加载器负责将程序加载到内存中。

(3)程序在编译连接时用链接器,运行时用加载器,这两个东西对程序运行原理非常重要。见书籍《链接器和加载器》。

(4)argc和argv的传参如何实现的?

  • 先传给加载器,加载器传给引导代码,最后引导代码传给main。

2、程序如何结束?

(1)正常终止:return、exit、_exit;

(2)非正常终止:自己或他人发信号,终止进程;(比如ctrl c 终止正在运行的程序)


3、使用atexit注册(进程终止处理函数

  • 所谓进程终止处理函数,即进程终止前,所要做的处理;
  • atexit函数的原型如下。


(1)实验演示

#include <stdio.h>#include <stdlib.h>#include <unistd.h>void func1(void){printf("func1\n");}void func2(void){printf("func2\n");}int main(void){printf("hello world.\n");// 当进程被正常终止时,系统会自动调用这里注册的func1执行atexit(func2);atexit(func1);printf("my name is lilei hanmeimei\n");//return 0;//exit(0);_exit(0);}

(2)使用atexit注册多个进程终止处理函数,先注册的后执行。

  • 先进后出,和栈一样,其实就是对函数指针进行压栈(注册时)、出栈操作(执行时)

(3)return、exit和_exit的区别

  • return和exit效果一样,都是会执行进程终止处理函数;
  • 用_exit终止进程时,并不执行atexit注册的进程终止处理函数。


阅读全文
0 0