程序的启动与退出过程

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


    内核首先调用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. oracle中修改表已有数据的某一列的字段类型的方法,数据备份

    1.在开发过程中经常会遇到表中的某一个字段数据类型不对,比如说需要保存的数据带小数,但是在最初设计的时候是给的number(10)类型,开始保存是整数的时候满足要求,后来在保存小数的时候 会发现自动四 ...

  2. Python面试题之回调函数

    0x00 概述 编程分为两类:系统编程(system programming)和应用编程(application programming).所谓系统编程,简单来说,就是编写库:而应用编程就是利用写好的 ...

  3. 20145314郑凯杰《信息安全系统设计基础》第7周学习总结 part B

    20145314郑凯杰<信息安全系统设计基础>第7周学习总结 part B 上篇博客反思与深入 首先根据本周第一篇博客,娄老师给我的评论,我开始进行局部性的深入研究: 分为两个步骤,一是知 ...

  4. 20145314郑凯杰 《Java程序设计》第1周学习总结

    20145314郑凯杰 <Java程序设计>第1周学习总结 教材学习内容总结 跟着教材的顺序开始总结我学过的内容: 1.三大平台 JAVA SE ,JAVA EE,JAVA ME 从毕向东 ...

  5. 地址之间的复制,memcpy函数

    #include <stdio.h> #include <stdlib.h>   int main(int argc, char *argv[]) {     char a[3 ...

  6. MR案例:定制Partitioner

    可以继承基类Partitioner,也可以继承默认的HashPartitioner类,覆写其中的 getPartition() 方法实现自己的分区. 需求:本例是对上一个实例的改写,需求不变 pack ...

  7. ubuntu18.04编译openwrt前的准备

    1.获取openwrt源码 git clone https://github.com/openwrt/openwrt.git 2.安装一些库及必备程序: sudo apt-get install li ...

  8. Xcode8编辑代码崩溃解决办法

    更新了Xcode8带来了一系列问题,最大的困扰就是不支持插件了,而且最关键的是一敲代码就崩溃(就是写一个字母就开始崩),在网上找了很多解决,发现是之前装的插件遗留下来的问题,将插件全部删掉就解决了,下 ...

  9. mysql分库分表(二)

    mysql分库分表 参考: https://www.cnblogs.com/dongruiha/p/6727783.html https://www.cnblogs.com/oldUncle/p/64 ...

  10. LeetCode——Longest Palindromic Subsequence

    1. Question Given a string s, find the longest palindromic subsequence's length in s. You may assume ...