父进程等待子进程退出(linux系统编程)

2023-11-01

为什么要等待子进程退出
父进程等待子进程退出并收集子进程退出状态
子进程退出状态不被收集,会变成僵尸进程
举个例子

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>


int main()
{
	pid_t pid;
	int i;
	int cnt=0;
	pid=fork();
	if(pid > 0){//父进程
		while(1){
			printf("这是父进程,pid=%d\n",getpid());
			printf("cnt=%d\n",cnt);
			sleep(2);//防止刷屏
		}	
	}else if(pid == 0){//子进程
		for(i=0;i<5;i++){//看看是不是保证子进程先运行,五次过后推出进入父进程
			printf("这是子进程,pid=%d,这是第%d次\n",getpid(),i+1);
			cnt++;
			sleep(1);//防止刷屏
		}
		exit(-1);

	}
	return 0;
}

在这里插入图片描述

在这里插入图片描述
此时运行的结果是子进程退出了,但是退出状态没有被收集,子进程成了僵尸进程。

介绍一个函数wait()
在这里插入图片描述
在这里插入图片描述

wait(int *status):
status参数,他是一个整型数指针。
非空:
子进程退出状态放在它所指向的地址
空:
不关心退出状态
举例说明
还是用上面的代码进行修改

在这里插入代码片

在这里插入图片描述

在这里插入图片描述
可以看出此时的子进程就不是僵尸进程
等待子进程退出丙炔查看他的退出状态

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>



int main()
{
	pid_t pid;
	int i;
	int cnt=0;
	int status;
	pid=fork();
	if(pid > 0){//父进程
		wait(&status);
		printf("子进程退出,status:%d\n",status);
		while(1){
			
			printf("这是父进程,pid=%d\n",getpid());
			printf("cnt=%d\n",cnt);
			sleep(2);//防止刷屏
		}	
	}else if(pid == 0){//子进程
		for(i=0;i<5;i++){//看看是不是保证子进程先运行,五次过后推出进入父进程
			printf("这是子进程,pid=%d,这是第%d次\n",getpid(),i+1);
			cnt++;
			sleep(1);//防止刷屏
		}
		exit(3);

	}
	return 0;
}

在这里插入图片描述
我们可以看到并不是我们想的结果,我们想要的是此时ststus应该等于3
该如何解决呢
应该调用这个宏
在这里插入图片描述

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>



int main()
{
	pid_t pid;
	int i;
	int cnt=0;
	int status;
	pid=fork();
	if(pid > 0){//父进程
		wait(&status);
		printf("子进程退出,status:%d\n",WEXITSTATUS(status));
		while(1){
			
			printf("这是父进程,pid=%d\n",getpid());
			printf("cnt=%d\n",cnt);
			sleep(2);//防止刷屏
		}	
	}else if(pid == 0){//子进程
		for(i=0;i<5;i++){//看看是不是保证子进程先运行,五次过后推出进入父进程
			printf("这是子进程,pid=%d,这是第%d次\n",getpid(),i+1);
			cnt++;
			sleep(1);//防止刷屏
		}
		exit(3);

	}
	return 0;
}

这回就能得到想要的结果
在这里插入图片描述
接下来看第二个函数waitpid()
在这里插入图片描述
在这里插入图片描述
status参数,他是一个整型数指针。
非空:
子进程退出状态放在它所指向的地址
空:
不关心退出状态
代码实现

在这里插入代码片

在这里插入图片描述
在这里插入图片描述
出了点问题,可以发现这边的子进程变成了僵尸进程。

孤儿进程
父进程如果不等待子进程退出 ,在子进程之前就结束了自己的生命,此时的子进程就叫做是孤儿进程
Linux避免系统存在太多的孤儿进程,init进程收留孤儿进程,变成孤儿进程的父进程
代码体现

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/wait.h>



int main()
{
	pid_t pid;
	int i;
	int status;
	int cunt=0;
	pid=fork();
	if(pid > 0){
		
			printf("这是父进程,pid=%d\n",getpid());
			printf("cunt=%d\n",cunt);
			sleep(2);
		
	}else if(pid == 0){
		for(i=0;i<5;i++){
			printf("这是子进程,pid=%d,我的父进程的pid=%d\n",getpid(),getppid());
			cunt++;
			sleep(2);
		}
		exit(3);
	}




	return 0;
}

在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

父进程等待子进程退出(linux系统编程) 的相关文章

  • _dl_runtime_resolve -- 共享对象何时加载到内存中?

    我们有一个对性能要求很高的消息处理系统 最近我们注意到第一条消息比后续消息花费的时间要长很多倍 当它通过我们的系统时 会发生大量转换和消息增强 其中大部分是通过外部库完成的 我刚刚描述了这个问题 使用 callgrind 将仅一条消息的 运
  • 从sourceforge下载最新版本

    我正在尝试在 bash 脚本中从 Sourceforge 下载最新版本的graphicsmagick wget q https sourceforge net projects graphicsmagick files latest dow
  • 在哪里可以找到所有 C 标准库的源代码?

    我正在寻找所有 C 标准库的完整源代码 也就是说 我正在寻找 stdio h stdlib h string h math h 等的源代码 我想看看它们是如何创建的 我认为这取决于不同的平台 但 Linux 或 Windows 都会受到欢迎
  • 我如何知道用户在使用 ncurses (Linux) 的控制台中按下了 ESC 键?

    I have a problem in detecting whether I just got a plain ESC key just code 27 or whether it was another special key such
  • Tk 初始化失败:无显示名称且无 $DISPLAY 环境变量

    我试图从 Ubuntu 终端调用 Centos 服务器上的工具 我收到以下错误 Tk 初始化失败 没有显示名称 也没有 DISPLAY 环境变量 请帮我解决这个问题 提前致谢 连接到你的 CentOS 机器ssh Y其中 每man ssh
  • 在 4.x 内核上的 64 位内存中查找系统调用表

    我正在尝试编写一个简单的内核模块来查找 Linux 中的 sys call table 但遇到了一些麻烦 我在这里找到了 32 位 Linux 的基本指南 https memset wordpress com 2011 03 18 sysc
  • 在 shell 脚本中将脚本目录更改为用户的 homedir

    在我的 bash 脚本中 我需要将当前目录更改为用户的主目录 如果我想更改为用户的foo主目录 从命令行我可以执行以下操作 cd foo 效果很好 但是当我从script它告诉我 bar sh line 4 cd foo No such f
  • mod_perl 无法看到 /tmp 中的文件

    我有一些 mod perl 代码试图访问 tmp 下的文件 但它抛出 没有这样的文件或目录 错误 我在代码中添加了一个 ls al tmp 来查看 Perl 在目录中看到的内容 它只给了我 和 drwxrwxrwt 2 root root
  • 在linux中使用setcap [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 要将 cap net raw 功能添加到 例如 bin ping 我们使用以下命令 setcap cap net raw ep bin ping ep
  • C 标准库函数与系统调用。哪个是“open()”?

    I know fopen 在C标准库中 所以我绝对可以调用fopen C 程序中的函数 我感到困惑的是为什么我可以打电话给open 功能也一样 open 应该是系统调用 所以它不是标准库中的C函数 因为我能够成功地调用open 函数 我调用
  • 查找当前打开的文件句柄数(不是 lsof )

    在 NIX系统上 有没有办法找出当前正在运行的进程中有多少个打开的文件句柄 我正在从正在运行的进程中寻找在 C 中使用的 API 或公式 在某些系统上 见下文 您可以在 proc pid fd 中对它们进行计数 如果不属于其中之一 请参阅下
  • 在Linux中执行jar文件[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我创建了一个可执行的 Java jar 文件 也就是说 我将 java 程序正确打包到 jar 文件中 包括 META INF MANIFEST 文件
  • Git - 致命:无法获取当前工作目录?

    When I git clone从回购协议中 我得到 fatal Could not get current working directory No such file or directory 我该怎么办 我检查了服务器并发现 git文
  • 第一次如何配置postgresql?

    我刚刚安装了 postgresql 并在安装过程中指定了密码 x 当我尝试做的时候createdb并指定我收到消息的任何密码 createdb 无法连接到数据库 postgres 致命 用户密码身份验证失败 同样适用于createuser
  • 导出多个 LD_LIBRARY_PATH 的正确方法

    对于linux的使用 我是一个新手 根据有关我的项目的指南 我必须多次导出 LD LIBRARY PATH 并且我不确定是否不覆盖它们 Cupti Tensorflow CUDAit export LD LIBRARY PATH LD LI
  • 分割 tar.bz2 文件并单独提取每个文件

    我可以将一个大的 tar bz2 文件分割成几个较小的文件并在 Ubuntu 中单独提取这些小 tar bz2 文件吗 Thanks 我认为这不容易实现 A tar bz2是单个流 它没有像这样的索引zip这将允许跳到存档中特定文件的开头
  • 64位版本的adb和fastboot?

    我在 Debian 7 3 x64 已完全修补 上发现了以下错误 我很确定这是因为adb即使在其 SDK 工具的 64 位发行版中也是 32 位 which adb opt android sdk platform tools adb op
  • 使用多个 NIC 广播 UDP 数据包

    我正在 Linux 中为相机控制器构建嵌入式系统 非实时 我在让网络做我想做的事情时遇到问题 该系统有 3 个 NIC 1 个 100base T 和 2 个千兆端口 我将较慢的连接到相机 这就是它支持的全部 而较快的连接是与其他机器的点对
  • 为什么 ls -l 中的“总计”加起来不等于列出的总文件大小? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 为什么是total在输出中ls l打印为64并不是26078列出的所有文件的总数是多少 ls l test ls total 64 rw
  • 未找到 DEADLINE 调度策略

    我想在 C 中实现 DEADLINE 调度策略 我知道该功能已实现Linux 3 14 10我正在使用 Ubuntu 14 04Linux 3 17 0 031700 lowlatency 201410060605 SMP PREEMPT这

随机推荐

  • rtplib在linux上的编译安装

    JRTPlib简介 在http www tekuba net program 10 中提到过RTP的例程 这里参考网络上的资料给出JRtpLIB的嵌入式arm环境以及桌面环境开发环境的建立 RTP 是目前解决流媒体实时传输问题的最好办法 要
  • sql注入手法详解

    sql定义 sql 结构化查询语句 sql注入 首先我们通过前端将我们的payload 恶意代码 传送到后台服务器 传送到后台以后 我们提交的payload拼接到sql语句中 作为sql语句的一部分被执行 从而导致数据库又被脱库甚至删库的风
  • std:weak_ptr 用法小结。

    http blog csdn net coolmeme article details 43266319 参考了这篇博客 感谢博主的贡献 感谢博主的翻译 不过他写的太多了 我只是记录一下使用方法 原理就不深究了 需要了解其原理的可以自行去那
  • Unity性能优化一些学习总结

    关于Unity性能优化的自我总结 1 硬件支持优化 1 平台设置优化 减少FPS 在ProjectSetting gt Quality中的 VSync Count 参数会影响你的FPS EveryVBlank相当于FPS 60 EveryS
  • 【Go语言学习之路 2】Go目录结构划分

    目录结构划分 三个环境变量的配置 GOROOT Go 安装后的根目录 例如 D Program Files Go 安装过程中会由安装程序自动写入系统环境变量中 go语言自带的类库 GOBIN Go 的二进制文件存放目录 GOPATH bin
  • JDBC中级实现--数据库连接四要素的抽取与动态获取

    1 数据库连接四要素不应该写死在代码中 扩展性不高 应该抽取到配置文件中动态读取 扩展文件名 properties DRIVER CLASS NAME com mysql jdbc Driver URL jdbc mysql mysql j
  • 爬虫课程笔记(七)scrapy入门与深入

    爬虫课程笔记 Scrapy 异步与非阻塞区别 爬虫流程 入门 创建一个scrapy项目 生成一个爬虫 提取数据 保存数据 logging 实现翻页请求 深入scrapy 定义item 程序的debug信息 scrapy shell sett
  • Python学习笔记(小甲鱼版)

    目录 文章目录 一 python是什么 1 Python 特点 2 idea是什么 3 print 的作用是什么 4 基础语法 一 python是什么 Python 是一个高层次的结合了解释性 编译性 互动性和面向对象的脚本语言 Pytho
  • Hive小文件问题:如何产生、造成影响、解决办法

    一 小文件是如何产生的 1 动态分区插入数据 产生大量的小文件 从而导致map数量剧增 2 reduce数量越多 小文件也越多 reduce的个数和输出文件是对应的 3 数据源本身就包含大量的小文件 二 小文件问题的影响 1 从Hive的角
  • [NOI2010]超级钢琴【RMQ+贪心+堆】

    题目链接 超级棒的一道题 解这道题 需要分一下几步来看 取的是连续段 我们可以对每个可能起点去知道它的最大可能解 起点begin 最大可行解一定是begin L 1 begin R 1中的一个 如果每次都是取最大的话 那么下一个同起点的一定
  • 稳定的kvm服务器,KVM——服务器资源的充分利用

    内容要点 一 KVM介绍 二 KVM部署实例 一 KVM介绍 一 KVM虚拟化架构 KVM模块直接整合在linux内核中 二 KVM组成 1 KVM Driver 核心内核 虚拟机创建 虚拟机内存分配 虚拟CPU寄存器读写 虚拟CPU运行
  • Oracle将查询结果存入临时表的写法

    有时候因为查询结果很大且需要再跟其它表进行不同形式的连表查询 这是如果整个sql写下来不仅看起来臃肿而且查询效率也很低 Oracle提供了一种将查询结果存入到 临时表的写法可以讲查询结果存储到临时表中待用 我这里只记一种会话级别的用法 在当
  • MySQL-修改表(ALTER)

    常见的修改有 ALTER TABLE 表名 ADD 列名 索引 主键 外键等 ALTER TABLE 表名 DROP 列名 索引 主键 外键等 ALTER TABLE 表名 ALTER 仅用来改变某列的默认值 ALTER TABLE 表名
  • 常见排序算法04之堆排序

    常见排序算法04之堆排序 1 堆heap 何为堆 堆需要满足两个条件 1 元素插入按照完全二叉树插入 2 父节点值parent要大于左右子节点的值 大顶堆 所以例如有一数组 arr 4 10 3 5 1 先按照完全二叉树将元素插入树中 1能
  • 题目 1016: [编程入门]水仙花数判断

    题目描述 打印出所有 水仙花数 所谓 水仙花数 是指一个三位数 其各位数字立方和等于该本身 例如 153是一个水仙花数 因为153 1 3 5 3 3 3 输入格式 无 输出格式 输出每一个水仙花数 一个数占一行 判断是否是水仙花数 inc
  • 支付项目介绍-清结算、风控、路由系统

    这里只是说了个大概 详细细节还需要涉及到具体项目时去深入了解逻辑和规则 一 清结算系统 1 清结算订单流水 流程说明 1 消费订单系统将支付成功的订单推送进清结算流水 记录相关订单信息 2 结算周期是D0 记录预计结算时间 调用账务实时结算
  • 将文件间的编译依存关系将至最低

    include date h include address h class Person private Date theBirthDate Address theAddress date h和address h这些头文件中有任何一个被改
  • 绕懵逼之同步/异步 阻塞/非阻塞

    被面试官绕蒙蔽了 特此整理总结一下 1概念解析 1 1 同步与异步概念描述 同步异步概念与消息的通知机制有关 所谓同步就是一个任务的完成需要依赖另外一个任务时 只有等待被依赖的任务完成后 依赖的任务才能算完成 这是一种可靠的任务序列 要么成
  • C语言fgets()函数:以字符串形式读取文件

    点击上方蓝字关注我 了解更多咨询 C语言 fgets 函数从文本文件中读取一个字符串 并将其保存到内存变量中 fgets 函数位于
  • 父进程等待子进程退出(linux系统编程)

    为什么要等待子进程退出 父进程等待子进程退出并收集子进程退出状态 子进程退出状态不被收集 会变成僵尸进程 举个例子 include