父进程等待子进程退出

       一、 为什么要等待子进程退出?

        等待子进程退出是为了确保父进程能够在子进程执行完毕后继续执行或者处理子进程的结果。在许多情况下,父进程需要等待子进程完成后才能继续执行,以确保正确的执行顺序和结果。

以下是一些等待子进程退出的主要原因:

  1. 资源回收:子进程退出后,它占用的系统资源(如内存)需要被释放。如果父进程不等待子进程退出,这些资源可能会一直保留,导致资源泄漏或者系统资源不足。

  2. 获取子进程的返回状态:父进程可能需要获取子进程的退出状态码(exit status),以了解子进程的执行结果。这个状态码通常用来表示子进程的执行情况,比如是否成功完成任务,以及是否发生了错误。

  3. 协调任务顺序:在一些情况下,父进程可能需要等待子进程完成某些任务后才能继续执行自己的任务。通过等待子进程退出,父进程可以确保任务的顺序正确执行。

  4. 处理子进程的输出:如果子进程产生了输出(比如标准输出或标准错误输出),父进程可能需要等待子进程退出后才能获取并处理这些输出。

        父进程等待子进程退出 并收集子进程的退出状态,子进程退出状态不被收集,变成僵死进程(僵尸进程)。

        二、什么是僵尸进程?

        僵尸进程是指已经结束执行但其父进程尚未对其进行善后处理(回收其占用的系统资源)的子进程。在 Unix 和类 Unix 系统中,当一个进程结束执行时,它会留下一个称为僵尸进程的状态,此时系统仍会记录该进程的进程号和退出状态,但并未释放其占用的全部资源。

        造成僵尸进程的主要原因是父进程没有调用相应的系统调用(如wait()waitpid())来获取子进程的退出状态信息。通常情况下,父进程需要调用这些系统调用来回收子进程的资源,并清理僵尸进程。

        虽然僵尸进程本身并不会占用太多系统资源,但过多的僵尸进程可能会导致系统资源的浪费和进程表的混乱,甚至影响系统的稳定性。

下面展示有等待并收集子进程退出的状态:

#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>int main()
{pid_t  pid;int cnt = 0;int status = 10;pid = vfork();if(pid > 0){wait(&status); // 等待并收集子进程退出状态printf("child quit, child status = %d\n", WEXITSTATUS(status));while(1){printf("cnt = %d\n", cnt);printf("this is father print, pid = %d,\
child pid = %d\n", getpid(), pid);sleep(2);}}else if(pid == 0){while(1){printf("this is child print, pid = %d\n", getpid());sleep(2);cnt++;if(cnt == 3){exit(3);}}}return 0;
}

 可以看到,没有Z+的僵尸进程。

 

下面展示没有收集子进程退出状态的情况:

#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/wait.h>int main()
{pid_t  pid;int cnt = 0;int status = 10;pid = vfork();if(pid > 0){//              wait(&status);printf("child quit, child status = %d\n", WEXITSTATUS(status));while(1){printf("cnt = %d\n", cnt);printf("this is father print, pid = %d,\
child pid = %d\n", getpid(), pid);sleep(2);}}else if(pid == 0){while(1){printf("this is child print, pid = %d\n", getpid());sleep(2);cnt++;if(cnt == 3){exit(3);}}}return 0;
}

 可以发现,出现了Z+的僵尸进程。

        总结:

        在父进程调用 wait()waitpid() 等函数等待子进程退出时,操作系统会将子进程的退出状态信息传递给父进程,并在父进程成功获取退出状态后,释放子进程占用的系统资源,包括内存、文件描述符等。这样,子进程就不再是僵尸进程,而是完全被回收的进程,不再占用系统资源。   

wait 和 waitpid 的区别:

wait 使调用者阻塞, waitpid有一个选项,可以使调用者不阻塞。    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/17114.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024年,游戏行业还值得进入吗?

来自知乎问题“2024年&#xff0c;游戏行业还值得进入吗&#xff1f;”的回答。 ——原问题描述&#xff1a;从超小厂执行策划做起&#xff0c;未来有前途吗&#xff1f; 展望2024年&#xff0c;国内外的游戏市场环境或将变得更加复杂&#xff0c;曾经那个水大鱼大的时代过去了…

工智能在脉搏分析中的matlab应用

人工智能&#xff08;AI&#xff09;在脉搏分析中的应用可以通过多种方法实现&#xff0c;包括使用机器学习算法对脉搏信号进行分类、预测或异常检测。MATLAB是一个强大的平台&#xff0c;它提供了各种工具和功能来处理和分析这样的信号。以下是一个简化的步骤&#xff0c;说明…

RocketMQ如何保证顺序消费

为什么会有顺序消费的需求&#xff1f; 业务场景需要&#xff0c;比如一个订单的流程&#xff0c;从创建到支付到发货到评价&#xff0c;需要按照顺序进行。 有可能会有网络波动。 topic可能分为多个queue&#xff0c;那queue的分配是随机的&#xff0c;不同queue之间的消费速…

出现 PermissionError: [Errno 13] Permission denied: ‘/Data‘ 解决方法

目录 1. 问题所示2. 原理分析3. 解决方法1. 问题所示 执行某个项目的时候,出现如下问题 File "/home/l228/huoyanhao/pytorch-glow-master/pytorch-glow-master/misc/util.py", line 179, in create_result_subdiros.makedirs(result_subdir)File "/home/l228…

C++: 二叉搜索树及实现

目录 一、二叉搜索树的概念 二、二叉搜索树的操作 2.1插入 2.2删除 1.有左子树&#xff0c;无右子树 2.有右子树&#xff0c;无左子树 3.有左子树和右子树 三、二叉搜索树的实现 要点 前言&#xff1a;为了学习map和set&#xff0c;需要先学二叉搜索树作为铺垫。 一、…

基于51单片机的函数发生器设计

一.硬件方案 此函数信号发生器是基于单片机AT89C51设计而成的&#xff0c;能够产生频率范围在0Hz—535Hz的锯齿波、正弦波、三角波、矩形波四种波形&#xff0c;并且能够通过液晶屏1602显示各自的波形类型以及频率数值。电路主要由51单片机最小系统DA0832模数转换模块运放模块…

AI代理的类型、优势及示例

AI 代理的类型、优势和示例 AI 代理是重塑商业动态的关键技术进步。了解这些代理的运作方式&#xff0c;发现它们的关键优势包括效率、可扩展性和成本效益。我们将探索代理的实例及它们在各领域的应用&#xff0c;为未来的人工智能趋势和对客户体验的影响铺平道路。 想象一支由…

`“use strict“`在JavaScript中是什么?它背后的原理是什么?

JavaScript的严格模式(strict mode)是ECMAScript 5引入的一项特性。如果你在脚本或函数的顶部声明 use strict;,你就启用了严格模式: use strict;当JavaScript引擎看到这个指令时,它将开始以一种特殊的模式解释代码。在这种模式下,当检测到某些可能导致潜在错误的编码实…

多重继承引起的二义性问题和虚基类

多重继承容易引起的问题就是因为继承的成员同名而产生的二义性问题。 例&#xff1a;类A和类B中都有成员函数display和数据成员a,类C是类A和类B的直接派生类 情况一&#xff1a; class A {public:int a;void display(); }; class B {public:int a;void display; }; class C:…

添加AXI主IP(AXI4 Lite和AXI4)示例

添加AXI主IP&#xff08;AXI4 Lite和AXI4&#xff09;示例 将等效IP添加到框图中。以下是AXI Central的示例步骤 直接存储器存取&#xff08;CDMA&#xff09;&#xff1a; 1.右键单击方框图中的任意位置&#xff0c;然后选择“添加IP”。 2.搜索并双击AXI Central Direct Memo…

Android 录音AudioRecord

AudioRecord是安卓多媒体框架中用于录制音频的工具。它支持录制原始音频数据&#xff0c;即PCM数据&#xff0c;PCM数据不能被播放器直接播放&#xff0c;需要编码压缩成常见音频格式才能被播放器识别。通常生成PCM文件之后可将PCM文件转成WAV文件一般的播放器便可直接播放了。…

前端开发技巧 --判断文本是否溢出

const isTextOverflower()>{if(element){return element.offsetWidth > element.scrollWidth}return false}实现javascript 判断文本是否溢出

【除了知乎,大家都在逛什么?持续更新~~】

除了知乎&#xff0c;大家都在逛什么&#xff1f; 中文博客琅琊榜 https://github.com/qianguyihao/blog-list 中文博客琅琊榜&#xff0c;只收录优质的中文独立博客&#xff0c;全网最精品。已收录博客数量&#xff1a;328 个博客站点。 这些博主才华横溢&#xff0c;满怀自由…

【2024最新】软考资料大全(免费)

IT行业越来越卷&#xff0c;大家都在忙着搞证&#xff0c;你免费不搞一个&#xff1f; 不管有没有用&#xff0c;有总比没有好噻~ 【初级】&#xff0c;【中级】&#xff0c;【高级】 都有&#xff0c;而且全部免费&#xff0c;全部最新的&#xff01;真题&#xff0c;论文都…

Java查看线上对象的变量值

背影 有时候线上有些配置类&#xff0c;想查看下配置修改是否生效&#xff0c;传统的方法要通过打日志的方法&#xff0c;如果不想通过打日志的方法&#xff0c;有没有好的方案能解决这个问题呢 解决方案 arthas 步骤 得到类加载器的hashcode sc -d com.example.MyService…

眼底项目经验

眼底项目经验 可解释性不足问题眼底项目有多牛逼可解释性不足解法数据、算力、算法都免费送不仅预测当下&#xff0c;还能预测未来和慢病管理整合&#xff0c;形成一个实时健康检测生态 可解释性不足问题 今天下午和腾讯眼底项目人员讨论, 他们不准备做全身性的多疾种, 因为深…

LINUX环境基础练习题(附带答案)

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

【typescript - tsc 编译后路径问题/路径别名问题】

这几天在写typescript&#xff0c;遇到个路径依赖问题&#xff0c;编写的.ts文件直接运行OK&#xff0c;但是编译成.js后&#xff0c;运行提示 Error: Cannot find module xxx&#xff0c;&#x1f4dd;记录分析和解决过程 。 问题描述 原始文件&#xff0c;有index.ts 其会引…

小白不知道怎么投稿?记住这个好方法

作为一名单位信息宣传员,我最初踏上这条道路时,满心憧憬着通过文字传递我们单位的精彩瞬间,让社会听见我们的声音。然而,理想与现实之间的距离,却在一次次邮箱投稿的石沉大海中渐渐清晰。那时的我,像所有“小白”一样,以为只要用心撰写稿件,通过电子邮件发给各大媒体,就能收获满…

4 CSS的 变换、过渡与动画

CSS3引入了变换、过渡和动画特性&#xff0c;使得网页可以呈现出丰富的视觉效果和交互体验。通过这些新特性&#xff0c;开发者可以创建复杂的动画效果&#xff0c;而不需要使用JavaScript。 4.1 变换&#xff08;Transforms&#xff09; 变换允许开发者对元素进行旋转、缩放…