程序的启动与退出过程

先上图,了解进程运行的机制。


    内核首先调用exec,运行C启动进程,C启动进程会调用main()函数。
    其他所有函数都是由main函数直接或间接调用的。
    从Figure7.2可以看出,内核与用户进程的交互,直接使用的只有三个函数:exec、_exit、_Exit
    exec是用来启动C启动历程的,关于用户进程的退出,主要涉及以下三个函数:
  1. #include <stdlib.h>
  2. void exit(int status); //进行了进程的清理工作,最后应该也是调用了_Exit()或者_exit()
  3. void _Exit(int status);
  4. #include <unistd.h>
  5. void _exit(int status);
int status表示程序退出的状态。

程序的终止atexit

以个程序可以等级至多32个终止程序,这些函数又atexit()登记,由exit()自动调用:
  1. #include <stdlib.h>
  2. int atexit(void (*func)(void));
  3. Returns: 0 if OK, nonzero on error
exit调用终止程序的顺序与他们登记的顺序相反
接下来看一个例子
  1. #include "apue.h"
  2. #include "myerr.h"
  3. static void my_exit1(void);
  4. static void my_exit2(void);
  5. int
  6. main(void)
  7. {
  8. if (atexit(my_exit2) != 0)
  9. err_sys("can’t register my_exit2");
  10. if (atexit(my_exit1) != 0)
  11. err_sys("can’t register my_exit1");
  12. if (atexit(my_exit1) != 0) //登记了两次my_exit1
  13. err_sys("can’t register my_exit1");
  14. printf("main is done\n");
  15. return(0);
  16. }
  17. static void
  18. my_exit1(void)
  19. {
  20. printf("first exit handler\n");
  21. }
  22. static void
  23. my_exit2(void)
  24. {
  25. printf("second exit handler\n");
  26. }
运行:因为return与exit相当,所以在main退出时会执行exit,并调用了登记的两个函数。注意顺序
  1. windeal@ubuntu:~/Windeal/apue$ ./exe
  2. main is done
  3. first exit handler
  4. first exit handler
  5. second exit handler
注意:两个登记的函数,在return(相当于exit)时被执行,因为exit会做清理工作,会调用登记的两个函数
如果我们直接使用_exit()或者_Exit()直接退出,则链各个登记的函数变不会被调用。








APUE学习笔记——7main()函数启动与退出的更多相关文章

  1. APUE学习笔记——10.9 信号发送函数kill、 raise、alarm、pause

    转载注明出处:Windeal学习笔记 kil和raise kill()用来向进程或进程组发送信号 raise()用来向自身进程发送信号. #include <signal.h> int k ...

  2. APUE学习笔记3_文件IO

    APUE学习笔记3_文件IO Unix中的文件IO函数主要包括以下几个:open().read().write().lseek().close()等.这类I/O函数也被称为不带缓冲的I/O,标准I/O ...

  3. Matlab学习笔记 figure函数

    Matlab学习笔记 figure函数 matlab中的 figure 命令,能够创建一个用来显示图形输出的一个窗口对象.每一个这样的窗口都有一些属性,例如窗口的尺寸.位置,等等.下面一一介绍它们. ...

  4. matlab学习笔记 bsxfun函数

    matlab学习笔记 bsxfun函数 最近总是遇到 bsxfun这个函数,前几次因为无关紧要只是大概看了一下函数体去对比结果,今天再一次遇见了这个函数,想想还是有必要掌握的,遂查了些资料总结如下. ...

  5. Android学习笔记——Activity的启动和创建

    http://www.cnblogs.com/bastard/archive/2012/04/07/2436262.html Android Activity学习笔记——Activity的启动和创建 ...

  6. openstack学习笔记一 虚拟机启动过程代码跟踪

    openstack学习笔记一 虚拟机启动过程代码跟踪 本文主要通过对虚拟机创建过程的代码跟踪.观察虚拟机启动任务状态的变化,来透彻理解openstack各组件之间的作用过程. 当从horizon界面发 ...

  7. matlab学习笔记13_1 函数返回值

    一起来学matlab-matlab学习笔记13函数 13_1 函数返回值 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考文献 https://blog.csdn.net/qq_36556 ...

  8. swift学习笔记2——函数、闭包

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  9. haskell学习笔记_函数

    一开始学习函数式编程语言就被告知函数式编程语言是一种“定义式”的语言,而不是一种命令式的语言,在学习haskell的函数语法时,此感觉更加强烈,haskell的函数定义倾向于一种类似C++里面的swi ...

随机推荐

  1. jQuery判断元素是否显示 是否隐藏

    var node=$('#id'); 第一种写法 if(node.is(':hidden')){ //如果node是隐藏的则显示node元素,否则隐藏 node.show(); }else{ node ...

  2. Ubuntu 16.04 + Nvidia 显卡驱动 + Cuda 8.0 (问题总结 + 解决方案)【转】

    本文转载自:https://blog.csdn.net/Zafir_410/article/details/73188228 前言 前面好一阵子忙于写论文和改论文,好久没有做新实验了,最近又回到做实验 ...

  3. 教你如何挑选深度学习GPU【转】

    本文转载自:https://blog.csdn.net/qq_38906523/article/details/78730158 即将进入 2018 年,随着硬件的更新换代,越来越多的机器学习从业者又 ...

  4. ubuntu 18.04 64bit下如何安装python开发工具jupyter

    1.执行一下命令进行安装 sudo apt-get install python3-distutils wget https://bootstrap.pypa.io/get-pip.py sudo p ...

  5. [BZOJ2282]消防

    Description 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这个国家的人对火焰有超越宇宙的热情,所以这个国家 ...

  6. Linux系统巡检项目

    系统检测 1.检查系统类型 2.检查发行版本 3.检查内核版本 4.检查主机名称 5.检查是否启用SElinux 6.检测默认的语言/编码 7.检测uptime 8.检测最后启动时间等 CPU检查 1 ...

  7. linux ssh认证(公钥机)配置

    一.产生背景 在实际工作中,linux集群需要自动化的管理,市面上较常见的自动化运维工具诸如ansible,puppet,saltstack:轻量级的有pssh系列,这其中大多数工具使用的前提就是集群 ...

  8. elasticsearch系列(三)库表理解

    首先ES没有库和表的概念,只有index,type,document(详细术语可以看ES的系列一 http://www.cnblogs.com/ulysses-you/p/6736926.html), ...

  9. sa learning

    后缀数组之前一直在给队友搞,但是这个类太大了,预感到青岛八成会有,于是自己也学习一下,记录一下做题的历程 所用的模板暂时来自于队友的倍增nlogn da算法 int t1[maxn] , t2[max ...

  10. npm install 报错 ECONNREFUSED

    在window环境下,使用npm install 命令安装任何框架,都会报如下的错误 error code ECONNREFUSED error errno ECONNREFUSED error Fe ...