Linux5.2、进程等待

个人主页:Lei宝啊 

愿所有美好如期而遇


目录

进程等待的必要性

进程等待的方法

获取子进程status


进程等待的必要性

首先,子进程退出,如果父进程不去回收子进程资源,读取子进程的PCB,那么就会使子进程变成僵尸进程,进而导致内存泄漏,

另外,僵尸进程无法通过控制信号杀死,也就是说kill -9无法杀掉僵尸进程,因为僵尸进程本来就已经死了,只剩下PCB,在等待被读取。

进程通过等待的方式,回收子进程资源,读取进程PCB来获取子进程退出信息。(一般来说,如果父进程不做等待,那么父进程可能会比子进程先结束,那么子进程就会成为孤儿进程,这当然不是我们想看到的,看示例)。

我们可以看到父进程先退出,然后子进程成为孤儿进程,被操作系统所接管,几秒后子进程的资源被回收。

进程等待的方法

获取子进程status

接下来在这里我们来解释waitpid的参数

参数pid : -1  等待任意一个子进程,与wait等效。

                 >0 等待指定pid子进程。

参数status:32位,我们只看后16位,格式为8位退出码+7位信号编号,还有一位core dump标志

参数options:阻塞等待(参数为0)和非阻塞等待(参数为WNOHANG)

status我们用来获取进程的退出信息,我们先解释wait函数,看代码示例:

 我们也就看到wait成功回收了子进程。

wait(&status)等同于waitpid(-1,&status,0),属于阻塞等待,也就是说,父进程会等待子进程结束再继续执行。

我们将下面的waitpid(-1,&status,0)替换为wait(&status),得到的现象是相同的。

在fork之后,父进程应该执行他的输出语句,应该和子进程是同步的,但是现象就是子进程先执行完,父进程等待子进程结束再继续执行。 

status为什么是256呢?首先我们的进程是正常结束的,也就是没有异常信号,所以status后7位为0,而我们给子进程设置的退出码为1,则他的补码是这样的0000 0001,status 补码就是0000 0000 0000 0000 0000 0001 0000 0000,所以结果就是256。

接下来我们使用非阻塞等待:

我们这里使用基于非阻塞的轮询访问,也就是循环去调waitpid函数,同时也可以对比得出wait会阻塞在该行直到子进程结束,而waitpid不会阻塞,子进程未结束返回给rid为0,继续向下执行,如果rid>0,也就是子进程结束,返回的值为子进程的pid,rid<0,则异常,我们直接退出。

补充 

  • wait和waitpid是系统调用,这个我们是清楚的,而且他们是为了获取退出的子进程的退出码和信号,我们就有疑问,难道父进程不可以直接获取,或者说我们直接定义一个变量。我们自己获取吗?是的,不可以,首先进程之间是相互独立的,父进程无法直接去读取子进程的数据,因为进程是操作系统所管理的,他的数据不允许用户直接读取,只能通过系统调用,也就是我们的wait和waitpid获取,然后通过我们上面提到的方式组合在status里,返回给父进程。
  • 同时,我们可以从status中通过位运算提取出信号和退出码:                                                    提取信号:status & 0x7F  也就相当于&0000 0000 0000 0000 0000 0000 0111 1111              提取退出码:stauts >> 8 & 0xFF, 也就相当于& 0000 0000 0000 0000 0000 0000 1111 1111
  • waitpid,我们基于非阻塞轮询访问时,父进程可以进行其他操作,执行其他函数。

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

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

相关文章

如何通过MT-Bench评估大模型

如何评估LLM在开放性问题的回答能力 前面三篇博客中介绍了如何评估大模型&#xff0c;内容包括评估大模型时常用的指标&#xff0c;每个指标背后的含义&#xff0c;如何通过编写代码实现指标的收集。对于passk指标&#xff0c;还进行了专门的说明。在前面的博客中&#xff0c;我…

如何使用 TailwindCSS 画一条0.5px的线条

背景 在移动端项目&#xff0c;一般为了让线条看起来更细、更锐利&#xff0c;此时使用0.5px的线条是非常合适的。那么如何使用TailwindCSS画一条0.5px的线条呢&#xff1f; 在实现这个需求的时候&#xff0c;首先去TailwindCSS官网查了一下border有没有对应的内置工具类&…

mysql:查看服务端为了处理连接而创建的线程数量

使用命令show global status like Threads_created;可以查看服务端为了处理连接而创建的线程数量。 例如&#xff1a;

信息收集 - 网站架构

网站架构组成 通常,一个典型的网站架构包括以下组件: 动态脚本语言:动态脚本语言用于处理网站的逻辑和动态内容生成。常见的动态脚本语言包括PHP、Python、Ruby和Node.js等。这些脚本语言可以根据用户请求生成动态的网页内容。 数据库:数据库用于存储网站的数据,包括用户…

对GPU进行压力测试

GPU压力测试工具安装指导&#xff08;RHEL8.2&#xff09; - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/443165016 1、下载gpu-burn工具 下载地址&#xff1a;https://github.com/wilicc/gpu-burn 2、上传到系统后安装 # unzip gpu-burn-master.zip # cd gpu-burn-mas…

华清远见嵌入式学习——ARM——作业1

要求&#xff1a; 代码&#xff1a; mov r0,#0 用于加mov r1,#1 初始值mov r2,#101 终止值loop: cmp r1,r2addne r0,r0,r1addne r1,r1,#1bne loop 效果&#xff1a;

【Spring-Securty】安全框架使用详解

前言&#xff1a; 上一篇我分享了&#xff0c;关于使用swarrger的博客&#xff0c; 今天来分享关于security的操作&#xff1a; 在日常开发中&#xff0c;几乎所有的项目都需要进行请求的安全校验操作。 通常会采取以下几种方式来实现安全校验和过滤。 1、实例化HandlerInterce…

PSP - 蛋白质与蛋白质的扩散对接 DiffDock-PP 算法

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/135115528 DiffDock-PP is a new approach to rigid-body protein-protein docking that is based on a diffusion generative model that learns…

回归预测 | MATLAB实现GWO-DHKELM基于灰狼算法优化深度混合核极限学习机的数据回归预测 (多指标,多图)

回归预测 | MATLAB实现GWO-DHKELM基于灰狼算法优化深度混合核极限学习机的数据回归预测 &#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现GWO-DHKELM基于灰狼算法优化深度混合核极限学习机的数据回归预测 &#xff08;多指标&#xff0c;多图&#…

SLA阿里云,腾讯云,华为云服务测量指标

SLA 的由来 在云计算时代&#xff0c;越来越多企业的服务迁移到云上&#xff0c;各大云服务厂商有自己服务发布的SLA&#xff0c;SLA是服务提供商与客户之间定义的正式承诺。 我们使用云服务提供商为我们提供的 APP 或者网站&#xff0c;如果出现购物无法下单、看视频打不开类…

浅析 ArrayList

ArrayList是一个使用List接口实现的Java类。顾名思义&#xff0c;Java ArrayList提供了动态数组的功能&#xff0c;其中数组的大小不是固定的。它实现了所有可选的列表操作&#xff0c;并允许所有元素&#xff0c;包括null。 ArrayList 继承于 AbstractList &#xff0c;实现了…

js知识点1:防抖节流

js知识点1&#xff1a;防抖节流 防抖节流 防抖节流&#xff0c;本质上是优化高频率执行代码的一种手段 定义&#xff1a; 防抖: n 秒后再执行该事件&#xff0c;若在 n 秒内被重复触发&#xff0c;则重新计时 节流: n 秒内只运行一次&#xff0c;若在 n 秒内重复触发&#xff0…