父进程等待子进程退出

news2024/11/26 12:24:36

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

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

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

  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.coloradmin.cn/o/1688961.html

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

相关文章

chessbase的中文语言strings文件比较与生成工具

请支持我的店铺tao 宝 王后兵 店 把chessbase17或fritz19根目录&#xff08;如C:\Program Files\ChessBase\CBase17&#xff09;的messages文件夹复制到本py文件所在的文件夹&#xff0c;运行本py文件可以生成新的Chinese strings文件。 strings2.py """strin…

第52期|GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

Vitis HLS 学习笔记--基本指针和算术指针

目录 1. 简介 2. 基本指针 3. 算术指针 4. 疑点解答 4.1 疑点1 4.2 疑点2 5. 总结 1. 简介 在 C/C 语言中&#xff0c;指针被广泛用来表示内存中的地址信息&#xff0c;它们是理解和使用这些语言的核心概念之一。然而&#xff0c;在 Vitis HLS 中&#xff0c;指针的使用…

Unity射击游戏开发教程:(20)增加护盾强度

在本文中,我们将增强护盾,使其在受到超过 1 次攻击后才会被禁用。 Player 脚本具有 Shield PowerUp 方法,我们需要调整盾牌在被摧毁之前可以承受的数量,因此我们将声明一个 int 变量来设置盾牌可以承受的击中数量。

【大模型】fineturn Q-wen

github上下载qwen1_5源码 修改finetun.sh 然后在路径qwen1_5/examples/sft下修改finetun.sh, 内容如下 #!/bin/bash export CUDA_DEVICE_MAX_CONNECTIONS1 DIRpwd# Guide: # This script supports distributed training on multi-gpu workers (as well as single-worker trai…

大数据Hadoop之-工具HIVE(一)

大数据Hadoop之——数据仓库Hive HIVE介绍Hive是基于Hadoop的一个数据仓库(Data Aarehouse,简称数仓、DW),可以将结构化的数据文件映射为一张数据库表,并提供类SQL查询功能。是用于存储、分析、报告的数据系统。 在Hadoop生态系统中,HDFS用于存储数据,Yarn用于资源管理…

WSL调用docker

WSL&#xff08;windows subsystem linux&#xff09;是window系统的原生linux子系统&#xff0c;用于代码开发很方便。 希望在wsl里面运行docker&#xff0c;首先要安装docker在WSL中使用&#xff0c;大部分人的第一想法肯定是用以下命令行安装&#xff08;个人不推荐&#x…

大语言模型本地部署与使用_ollama_open-webui

概述 本文主要记录如何使用ollama运行开源的大语言模型如llama3等&#xff0c;以及如何使用open-webui进行交互。 ollama支持MacOS、Linux、Windows等操作系统&#xff0c;这里主要以Linux和Windows为主&#xff0c;讲述如何在本地运行大语言模型。 一 安装ollama 1.1 Wind…

centos 8.5 yum 更换阿里云源

在CentOS 8上更换为阿里云源,步骤操作&#xff1a; 1 备份当前的yum源配置文件 cp -a /etc/yum.repos.d /etc/yum.repos.d.backup 2 清理原来 官方默认源 rm -rf /etc/yum.repos.d/*.repo 3 下载阿里云CentOS 8的yum源配置文件 curl -o /etc/yum.repos.d/CentOS-Base.rep…

桌面藏线大法

1有线改无线&#xff1a; 蓝牙鼠标 蓝牙键盘 蓝牙耳机 2将排插贴到桌子底下 购物软件上搜 3断舍离 不要的电子产品统统扔掉 4 洞洞板和挂钩 这个不用介绍了

由于找不到mfc140u.dll怎么办,介绍5种靠谱有效的解决方法

当您的电脑显示“mfc140u.dll丢失”的错误时&#xff0c;通常是因为系统中缺少了某个必要的动态链接库文件。这个问题可能会导致某些应用程序无法正常运行&#xff0c;给用户带来困扰。下面我将详细介绍解决该问题的五种方法。 一&#xff0c;关于mfc140u.dll文件的概述 mfc14…

如何在 ASP.NET Core 中实现中间件管道

概述:借助 ASP.NET Core,中间件流水线可以作为一种轻量级、灵活的机制,使开发人员能够在请求流水线的不同阶段插入功能。这些中间件组件可以执行各种任务,例如日志记录、身份验证、授权、异常处理等。它们提供了一种封装和组织代码的方法,促进了更简洁、更易于维护的应用程…

Java类和对象(五)—— 抽象类、接口、Object类和内部类

抽象类 在继承体系下&#xff0c;父类有些方法可能是要被重写的&#xff0c;如果我们事先就知道某些方法需要重写的话&#xff0c;我们可以不用在父类里面具体实现这个方法&#xff0c;这时候我们会用到抽象方法&#xff0c;这时候我们会用到关键字abstract关键字来修饰 publ…

618值得买的好物清单,这些数码好物你千万不能错过!

​随着618购物节的距离越来越近&#xff0c;你是不是已经开始疯狂浏览购物app&#xff0c;准备大肆采购一番了&#xff1f;但是在购物之前&#xff0c;还是得先做一做功课&#xff0c;避免陷入购物陷阱&#xff0c;而作为一名经验丰富的数码爱好者&#xff0c;想通过这次机会给…

Xinstall助力实现App间直接跳转,提升用户体验

在移动互联网时代&#xff0c;App已成为我们日常生活中不可或缺的一部分。然而&#xff0c;在使用各类App时&#xff0c;我们经常会遇到需要在不同App之间切换的情况&#xff0c;这时如果能够直接跳转&#xff0c;将会大大提升用户体验。而Xinstall正是这样一款能够帮助开发者实…

Python语法学习之 - 生成器表达式(Generator Expression)

第一次见这样的语法 本人之前一直是Java工程师&#xff0c;最近接触了一个Python项目&#xff0c;第一次看到如下的代码&#xff1a; i sum(letter in target_arr for letter in source_arr)这条语句是计算source 与 target 数组中有几个单词是相同的。 当我第一眼看到这样…

Docker镜像源自动测试镜像速度,并选择速度最快的镜像

国内执行如下代码 bash <(curl -sSL https://gitee.com/xjxjin/scripts/raw/main/check_docker_registry.sh)国外执行如下代码 bash <(curl -sSL https://github.com/xjxjin/scripts/raw/main/check_docker_registry.sh)如果有老铁有比较不错的镜像源&#xff0c;可以提…

浏览器API与协议

现代浏览器是一个囊括了数百个组件的操作系统&#xff0c;包括进程管理、安全沙箱、分层的优化缓存、JavaScript虚拟机、图形渲染和GPU管道、存储系统、传感器、音频和视频&#xff0c;网络机制等等。 在浏览器上运行的应用的性能。&#xff0c;取决于多个组件&#xff1a;解析…

完整的数据可视化方法集

在当前的大数据时代&#xff0c;了解如何可视化数据是UI/UX设计师技能的重要组成部分。如今&#xff0c;几乎所有的公司都需要良好的数据可视化作为确定业务方向和决策的参考。数据的可视化结果越好&#xff0c;用户的决策就越科学。 1、什么是数据可视化 数据可视化是将信息…

The Missing Semester of Your CS Education(计算机教育中缺失的一课)

Shell 工具和脚本(Shell Tools and Scripting) 一、shell脚本 1.1、变量赋值 在bash中为变量赋值的语法是foobar&#xff0c;访问变量中存储的数值&#xff0c;其语法为 $foo。 需要注意的是&#xff0c;foo bar &#xff08;使用空格隔开&#xff09;是不能正确工作的&…