内核要运行一个应用程序,唯一的途径是通过系统调用。exec函数。exec又会调用启动程序,启动程序(一般是汇编语言)以类似以下的方式调用main函数:
void exit(main(argc, argv));
那么在main函数末尾使用exit(0)和使用return 0是等价的。

这里有三个正常终止程序的函数:

void exit(int status);     // 先运行一些清理操作,然后进入内核
void _Exit(int status); // 马上进入内核,可在全部函数中调用
void _exit(int status); // 马上进入内核。可在全部函数中调用
exit函数一般做三类事情:
  • 运行由atexit函数登记的各终止处理程序
  • 总是运行一个标准IO库的清理关闭操作:为全部打开流调用fclose函数
  • 调用_exit或_Exit函数返回内核
注意最后一步。exit终于还是要调用_exit或_Exit回到内核。

进程有5种正常终止方式和3种异常终止方式(P178),无论进程怎样终止,最后都会运行内核中的同一段代码。这段代码为对应进程关闭全部开打描写叙述符,释放它所使用的存储器等。


以下是一个进程启动和退出的总体流程图:



从上图能够看出,内核启动程序的唯一方法是exec系统调用,而进程自愿终止(相对于非自愿终止,如信号)的唯一方法是通过exit或_exit或_Exit函数回到内核。


注意到上面三个函数的參数status。这是进程退出时的退出状态。内核将退出状态转换成终止状态。该终止状态可以由该进程的父进程通过wait或waitpid函数捕获。也就是说父进程可以获得子进程退出时的终止状态。


依据上面的描写叙述。有几个问题须要考虑:
  • 父进程在子进程之前终止,会发生什么?这样的情况下,它们的父进程会改变为init进程,称由init进程领养。
  • 子进程在父进程之前终止,内核为终止子进程保存的信息怎样给父进程?在这样的情况下。父进程调用wait或waitpid能够得到这些信息。假设父进程没有进行这样的调用,则子进程占用的资源不会全然释放,这时该子进程称为僵死进程。
  • 由init领养的进程终止时会发生什么?init被编写成不管何时,仅仅要有子进程终止。它都会调用wait函数获得其终止状态。

    所以init的子进程不可能成为僵死进程。


參考:
《unix环境高级编程》 P147-P151、P178.

【Linux编程】进程终止和exit函数的更多相关文章

  1. Linux下进程终止过程

    不管是在什么系统中,当进程终止之后.系统都须要释放进程占有的资源. 否则.系统资源会被耗尽. 以下将具体说明Linux系统中,进程终止的过程. 进程终止方式 linux的进程终止方式有8种,当中5种是 ...

  2. 进程控制之exit函数

    进程有下面5种正常终止方式: (1)在main函数内执行return语句.这等效于调用exit. (2)调用exit函数.此函数有ISO C定义,其操作包括调用各终止处理程序(终止处理程序在调用ate ...

  3. Linux编程---进程通信

    Linux的通信方式主要有分类有以下几种: -匿名管道和FIFO有名管道 -消息队列,信号量和共享存储 -套接字 对于套接字的进程通信,我就留在套接字的文章中再写了. 一.管道 管道是最古老的进程通信 ...

  4. linux服务器开发二(系统编程)--进程相关

    进程相关的概念 程序与进程 程序,是指编译好的二进制文件,在磁盘上,不占用系统资源(CPU.内存.打开的文件.设备.锁等等). 进程,是一个抽象的概念,与操作系统原理联系紧密.进程是活跃的程序,占用系 ...

  5. UNIX环境编程学习笔记(19)——进程管理之fork 函数的深入学习

    lienhua342014-10-07 在“进程控制三部曲”中,我们学习到了 fork 是三部曲的第一部,用于创建一个新进程.但是关于 fork 的更深入的一些的东西我们还没有涉及到,例如,fork ...

  6. atexit函数和exit函数的理解

    按照ISO C的规定,一个进程可以登记多达32个函数,这些函数将由exit自动调用,通常这32个函数被称为终止处理程序,并调用atexit函数来登记这些函数. 我们通常认为C语言的起始函数是main函 ...

  7. exit函数和return语句

    exit函数是c语言的库函数,有一个整型的参数,代表进程终止,这个函数需<stdlib.h>头文件 在函数中写return只是代表函数终止了,不管在程序的任何位置调用exit那么进程就立即 ...

  8. Linux多任务编程之四:exit()函数及其基础实验(转)

    来源:CSDN  作者:王文松   转自Linux公社 exit()和_exit()函数 函数说明 创建进程使用fork()函数,执行进程使用exec函数族,终止进程则使用exit()和_exit() ...

  9. UNIX环境编程学习笔记(21)——进程管理之获取进程终止状态的 wait 和 waitpid 函数

    lienhua342014-10-12 当一个进程正常或者异常终止时,内核就向其父进程发送 SIGCHLD信号.父进程可以选择忽略该信号,或者提供一个该信号发生时即被调用的函数(信号处理程序).对于这 ...

随机推荐

  1. luogu P3393 逃离僵尸岛-搜索剪枝+spfa

    P3393 逃离僵尸岛 题目描述 小a住的国家被僵尸侵略了!小a打算逃离到该国唯一的国际空港逃出这个国家. 该国有N个城市,城市之间有道路相连.一共有M条双向道路.保证没有自环和重边. K个城市已经被 ...

  2. PHP 安装完成后 增加 bcmath 模块

    1. cd /usr/local/src/php-5.6.38/ext/bcmath  目录2. /usr/local/php/bin/phpize  生成configure需要的配置文件3.  ./ ...

  3. mysql两种常用备份工具

    一.mysqldump备份: 在开启GTID模式时,在master上执行的备份: --set-gtid-purged=OFF 在开启GTID模式时,要在slave上执行,想重新搭建一套slave环境. ...

  4. 2. 更改InnoDB redo日志文件的数量或大小

    2. 更改InnoDB redo日志文件的数量或大小 要更改InnoDB 重做日志文件的数量或大小,请执行以下步骤: 1)停止MySQL服务器,确保正常关闭且没有错误发生 2) 编辑my.cnf以更改 ...

  5. 负载均衡之Ocelot+Consul(配置文件注册服务)

    继上篇 Ocellot 做负载均衡之后,本篇将记录 Ocelot + Consul 试验如何做服务发现和服务注册. 服务发现和服务注册的背景知识,一搜满街都是. 在此,我还是写下自己对这个术语的理解吧 ...

  6. oracle中的权限管理

    connect resource权限 grant connect,resource to user; 执行上面的sql语句后用户包括的权限: CONNECT角色: --是授予最终用户的典型权利,最基本 ...

  7. Fiddler抓包-get与post请求

    from:https://www.cnblogs.com/yoyoketang/p/6719717.html 本篇以博客园的请求为例,简单分析get与post数据有何不一样,以后也能分辨出哪些是get ...

  8. 【优先级队列】 Holedox Eating

    https://www.bnuoj.com/v3/contest_show.php?cid=9154#problem/M [Accepted] #include<iostream> #in ...

  9. java邮件工具类【最终版】

    http://www.xdemo.org/java-mail/ 对比链接中,添加了抄送和暗抄送功能(已解决,如图代码:抄送不能多个用户,会报错,未解之谜) sendHtmlmail方法可以发送附件以及 ...

  10. SpringBoot Beans定义 连接池

    SpringBoot Beans定义 原有Spring框架,定义Bean方法如下 xml配置 组件扫描.@Controller.@Service... 原有Spring框架,参数注入方法如下 常用的参 ...