【进程控制】超详细讲解wait和waitpid的原理(结合代码)

文章目录

    • 前言
    • waitpid函数
      • 参数option
      • 什么叫非阻塞等待?
      • 参数status
    • wait 函数

前言

在了解了进程状态这一概念之后,我们明白了什么叫做僵尸进程:子进程退出,父进程“不管不顾”。而一旦存在僵尸进程,势必也会存在内存泄露问题,所以作为一个父进程,及时处理子进程的退出信息是他的责任。那么子进程的退出信息到底是什么?以及父进程怎么接收到子进程的退出信息?本文章重点围绕这两个问题展开叙述。

进程等待
进程等待是指一个进程暂停执行,等待另一个进程的结束。最常见的是父进程等待自己的子进程,或者父进程回收自己的子进程资源包括僵尸进程

等待方法有:wait函数和waipid函数

waitpid函数

#include<sys/types.h>
#include<sys/wait.h>
pid_t waitpid(pid_t pid,int* status,int options);

在这里插入图片描述
waitpid返回导致waitpid函数返回的已终止子进程的PID。默认情况下(options=0),waipid会挂起调用程序的执行,此时父进程被阻塞直到它的等待集合中的一个子进程终止。等待集合的成员是由参数***pid***来确定的。

如果pid>0,那么等待集合就是一个单独的子进程,它的进程PID等于参数pid。
如果pid=-1,那么等待集合就是父进程的所有子进程。

查看执行waitpid过程中,父进程的状态
观察以下代码:
在这里插入图片描述
在这里插入图片描述
可以观察到在waitpid执行过程中父进程进入了阻塞状态。

参数option

可以通过将options设置为WONHANG、WUNTRACED和WCONTINUED的各种组合来修改默认行为。

WONHANG:挂起调用进程的执行,如果等待集合中的任何子进程都还没有终止,那么就立即返回(返回值为0).默认的行为是挂起调用进程,直到有子进程终止。在等待子进程终止的同时,可以做其他的动作

WUNTRACED:挂起调用进程的执行,直到等待集合中的一个进程变成终止或者被停止。返回的PID是等待导致waipid返回的子进程的PID.但我们想要检查已终止或者被停止的子进程时,可以用这个选项。

WCONTINUED:挂起调用进程的执行,直到等待集合中一个正在运行的进程终止或等待集合中一个被停止的进程收到SIGCONT信号重新开始执行

其中WONHANG选项可以使父进程发生非阻塞等待

什么叫非阻塞等待?

非阻塞等待是一种操作系统中的机制,它允许进程在等待子进程结束时,不必一直阻塞直到子进程退出。具体来说,当使用waitpid系统调用时,可以设置WNOHANG标志来启用非阻塞等待模式。如果子进程尚未结束,waitpid将立即返回,而不是等待子进程结束。这样,父进程可以在检测到子进程仍在运行时继续执行其他任务,并在稍后再次尝试检查子进程的状态,直到子进程结束。

以下代码可以观察到父进程在等待过程中,还可以做其他的事
在这里插入图片描述
在这里插入图片描述
如果带有WONHANG选项,waitpid如果返回值为0,说明子进程还没有终止,需要下一次重复进行等待。一般来说调用一次waitpid是不够的,因为不知道还要进行等待多少次,所以我这里配合循环等待。这样一种循环的非阻塞等待,就被称为非阻塞轮询方案

参数status

观察waitpid函数的声明,参数status是一个指针,能记录函数修改的值,也就是输出型参数。可以将参数设为NULL,意味着不关心子进程的退出信息。否则,status参数就记录着子进程退出信息
status代表的整数有32个比特位,其中低16位的比特位记录着子进程的退出码和退出信号。

在这里插入图片描述
8-15位二进制转换为十进制表示的就是退出码,0-6位7个二进制表示的是退出信号。
假设截取到status的低16位二进制为:
0000 0001 0000 0000就表示子进程的退出码为1,退出信号为0(无异常)。
用以下代码测试status的值
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
了解了status的作用,也就知道了父进程是如何接收到子进程的退出信息的了。同样,也很清楚的明白了,子进程的退出信息无非就是退出码和退出信号。作为父进程有权利也有义务去了解一个子进程的退出信息。

wait 函数

#include<sys/types.h>
#include<sys/wait.h>
pid_t wait(int*status);

wait函数作用和waitpid相识,相当于waitpid的简单版本,返回被等待进程的pid(一有子进程终止就返回),失败返回-1。其参数status的含义与waitpid中的一致。

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

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

相关文章

SpringBoot整合Redis:面试必考题-缓存击穿--逻辑过期解决

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏Redis实战与进阶 本专栏讲解Redis从原理到实践 …

如何解决Modbus转Profinet网关通信不稳定或数据丢失问题

接到现场反映&#xff0c;在配置Modbus转Profinet网关时&#xff0c;出现Modbus转Profinet网关&#xff08;XD-MDPN100&#xff09;通信不稳定或数据丢失的问题&#xff0c;就这个问题特做出答疑。 解决Modbus转Profinet网关&#xff08;XD-MDPN100&#xff09;通信不稳定或数据…

【Java.mysql】——数据删改(DU) 附加数据库约束

目录 &#x1f6a9;更新(Update) &#x1f6a9;删除&#xff08;Delete&#xff09; &#x1f6a9;数据库约束 &#x1f388;约束类型 ✅NULL约束 ✅NNIQUE 唯一约束 ✅DEFAULT&#xff1a;默认值约束 ✅PRIMARY KEY&#xff1a;主键约束 ✅FOREIGN KEY&#xff1a;外键…

python Flask扩展:如何查找高效开发的第三方模块(库/插件)

如何找到扩展以及使用扩展的文档 一、背景二、如何寻找框架的扩展&#xff1f;三、找到想要的扩展四、找到使用扩展的文档五、项目中实战扩展 一、背景 刚入门python的flask的框架&#xff0c;跟着文档学习了一些以后&#xff0c;想着其实在项目开发中&#xff0c;经常会用到发…

jenkins配置源码管理的git地址时,怎么使用不了 credential凭证信息

前提 Jenkins使用docker部署 问题 &#xff08;在jenlins中设置凭证的方式&#xff09;在Jenkins的任务重配置Git地址&#xff0c;并且设置了git凭证,但是验证不通过&#xff0c;报错; 无法连接仓库&#xff1a;Command "git ls-remote -h -- http://192.1XX.0.98:X02/…

设计模式之建造者模式精讲

也叫生成器模式。将一个复杂的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。 在建造者模式中&#xff0c;有如下4个角色&#xff1a; 抽象建造者&#xff08;Builder&#xff09;&#xff1a;用于规范产品的各个组成部分&#xff0c;并进行抽象&…

Redis安装详细教程

Redis安装详细教程 文章目录 Redis安装详细教程前言一、windows下安装Redis1、下载地址2、启动redis服务3、连接redis 二、Linux下安装Redis&#xff1a;直接安装1、下载并安装 三、Linux下安装Redis&#xff1a;Docker中安装 前言 一、windows下安装Redis 1、下载地址 官方下…

腾讯云4核8G服务器多少钱一年?谁知道?

2024年腾讯云4核8G服务器租用优惠价格&#xff1a;轻量应用服务器4核8G12M带宽646元15个月&#xff0c;CVM云服务器S5实例优惠价格1437.24元买一年送3个月&#xff0c;腾讯云4核8G服务器活动页面 txybk.com/go/txy 活动链接打开如下图&#xff1a; 腾讯云4核8G服务器优惠价格 轻…

《深入Linux内核架构》第3章 内存管理(4)

目录 3.4 初始化内存管理 3.4.1 建立数据结构 3.4.2 特定于体系架构的设置 内核在内存中的布局 初始化步骤 分页机制的初始化 3.4.3 启动期间的内存管理 数据结构 初始化 与内核的接口 停用bootmem分配器 释放初始化数据 3.4 初始化内存管理 包括&#xff1a; 显式…

IHO S-100系列产品标准

1 什么是S-100? S-100《通用海道测量数据模型》是国际海道测量组织(IHO)推出的新一代海上空间地理信息国际标准,旨在克服传统S-57数字海道测量数据传输标准的局限。这一标准不仅兼容了更为丰富的数据类型,如影像与栅格数据、时变数据等,还摒弃了固定的编码格式要求,采用…

2024/03/27(C++·day3)

一、思维导图 二、完成下面类 代码 #include <cstring> #include <iostream>using namespace std;class myString { private:char *str; // 记录C风格的字符串int size; // 记录字符串的实际长度public:// 无参构造函数myString() : size(10){str new char[si…

MySQL数据库高级语句

文章目录 MySQL高级语句older by 排序区间判断查询或与且&#xff08;or 与and&#xff09;嵌套查询&#xff08;多条件&#xff09;查询不重复记录distinctcount 计数限制结果条目limit别名as常用通配符嵌套查询&#xff08;子查询&#xff09;同表不同表嵌套查询还能用于删除…