程序的启动与退出过程

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


    内核首先调用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. Linux查看本机登陆用户信息(w、who、last和lastlog命令)

    w 命令 查看 Linux 服务器上目前已经登录的用户信息 [root@localhost ~]# w :: up :, users, load average:0.00, 0.00, 0.00 US ...

  2. mouseleave mouseout时候悬浮框不应该消失的时候消失了 css 解决办法

    要实现的效果和代码思路 简单来说就是 用一个div包着喇叭和悬浮框 悬浮事件写在这个div上 鼠标悬浮到div上的时候 悬浮框出现 最终要做成鼠标从小喇叭移动到下面的框上的时候 下面框是不会消失的. ...

  3. Git笔记之初识vi编辑器

    1.vi编辑器 如同Windows下的记事本,vi编辑器是Linux下的标配,通过它我们可以创建.编辑文件.它是一个随系统一起安装的文本编辑软件. vi编辑器提供了3种模式,分别是命令模式.插入模式. ...

  4. JAVA国际化输出日期格式

    1.建议控制台程序 使用 IntelliJ IDEA  创建 MAVEN项目, 不选别的选项,则为控制台程序. (其它方式创建的控制台程序可能编译不过) 2.源码如下: import java.tim ...

  5. [参考]C的scanf 和 C++的fscanf 的用法

    说明:本文不适合新手学习,适合用来做参考.本文参考有其他博客的内容,不过年代久远已经忘记了,在此感谢各位博主! scanf函数 用 法:int scanf(char *format[,argument ...

  6. 素数分布 - nefu 117

    素数个数的位数 - nefu 117 普及一个公式: 位数公式:要求一个数x的位数,用公式:lg(x)+1 素数分布:n/ln(n) 所以直接求解n/ln(n)的位数就可以了 代码如下: #inclu ...

  7. 从U盘安装linux(前人踩坑后人乘凉)

    今天踩了一个大坑,网上的教程从u盘安装linux少了一个关键步骤导致我挣扎了两个小时 废话不多说,开始需要准备一些东西 1.从官网下载一个Ubuntu 10.04的镜像 2.一个大于等于1G的支持启动 ...

  8. Java循环语句之 do...while

    do...while 循环与 while 循环语法有些类似,但执行过程差别比较大. 语法: 执行过程: <1>. 先执行一遍循环操作,然后判断循环条件是否成立 <2>. 如果条 ...

  9. 做文件上传下载时报这个错com.alibaba.fastjson.JSONException: illegal identifier : \

    ::-exec-] DEBUG c.i.e.m.I.insertDataEmebeding - <== Updates: ::-exec-] ERROR c.i.e.c.CaseArchiveC ...

  10. 转载:Javascript面向对象编程原理 -- 理解对象

    源地址:http://www.html-js.com/article/1717 虽然JavaScript中已经自带了很多内建引用类型,你还是会很频繁的需要创建自己的对象.JavaScript编程的很大 ...