Linux5.2、进程等待

news2024/11/25 22:42:11

个人主页: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.coloradmin.cn/o/1319530.html

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

相关文章

羊大师之冷天喝羊的好处大揭秘!

最近&#xff0c;冷天喝羊已经成为了一种趋势&#xff0c;受到了越来越多人的关注与喜爱。你可能会好奇&#xff0c;为什么冷天喝羊有那么多的好处呢&#xff1f;今天小编羊大师将带大家一起探索这个问题&#xff0c;揭秘冷天喝羊带来的种种益处。 冷天喝羊对于保持身体温暖是…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)控件的部分公共属性和事件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;控件的部分公共属性和事件 一、操作环境 操作系统: Windows 10 专业版 IDE:DevEco Studio 3.1 SDK:HarmonyOS 3.1 二、公共属性 常用的公共属性有&#xff1a; 宽(with)、高(height)、…

天猫数据平台-淘宝天猫数据-天猫销售数据分析:11月天猫平台滑雪运动装备行业销量翻倍!

随着天气变冷、冬季来临&#xff0c;迎来了疫情后的首个滑雪季&#xff0c;加之自冬奥会结束以来&#xff0c;大众参与冰雪运动的热度持续攀升&#xff0c;因此&#xff0c;冰雪运动的需求正集中释放。 根据相关数据显示&#xff0c;11月以来&#xff0c;全国滑雪场门票预订量较…

智能物流解决方案:科聪料箱移动机器人助力高效运输

料箱机器人是一种智能化物流搬运设备&#xff0c;无需借助任何轨道&#xff0c;即可实现多个料箱的智能拣选、存取、搬运。以料箱为存储单元的存储形式&#xff0c;通过信息化系统的统一调度和管理&#xff0c;实现小批量、多批次、高周转率的出入库、拣选等。 ▲料箱机器人现场…

推荐一款图集打包工具,png图片打包plist工具,手把手教你使用pngPackerGUI_V2.0

png图片打包plist工具&#xff0c;手把手教你使用pngPackerGUI_V2.0此软件是在pngpacker_V1.1软件基础之后&#xff0c;开发的界面化操作软件&#xff0c;方便不太懂命令行的小白快捷上手使用。1.下载并解压缩软件&#xff0c;得到如下目录&#xff0c;双击打开 pngPackerGUI.e…

antd-table:通过rowClassName实现斑马条纹样式+通过rowSelection实现单选功能效果——基础积累

斑马条纹 对于element-ui是有个stripe斑马条纹的属性的&#xff0c;最终呈现的效果如下&#xff1a; antd-table中是没有这个属性的&#xff0c;但是可以通过rowClassName&#xff1a;可以给对应行添加指定类名。 实现方法&#xff1a; <a-table:rowClassName"getRo…

【ESXi】ESXi 版本回退

目录 8. ESXi 版本回退8.1 版本回退条件与注意事项8.2 版本回退步骤8.3 示例演示&#xff08;1&#xff09;准备工作&#xff08;2&#xff09;进入DCUI界面&#xff08;3&#xff09;按 F11 重启系统引导&#xff08;4&#xff09;进入引导选项&#xff08;5&#xff09;进入 …

【玩转Node.JS】=> 之 Buffer(缓冲器)

Node.js 是一个开源、跨平台的 JavaScript 运行时环境 文章目录 Buffer 概念Buffer 的特点创建 BufferBuffer 与字符串的转化 Buffer 的读写 Buffer 概念 Buffer 是一个类似于数组的 对象 &#xff0c;用于表示固定长度的字节序列Buffer 本质是一段内存空间&#xff0c;专门用…

android工程目录结构

App工程分为两个层次&#xff0c;一个层次是项目&#xff0c;另一个层次是模块 模块依附于项目&#xff0c;每个项目至少有一个模块&#xff0c;也能拥有多个模块 一般所言的“编译运行App”&#xff0c;指的是运行某个模块&#xff0c;而非运行某个项目&#xff0c;因为模块才…

【docker】修改docker的数据目录

背景 主节点是分配了较少内存和存储的低配机器&#xff0c;因为我们系统的rancher是用docker镜像启动的&#xff0c;而rancher和docker的默认目录都放在/var/lib下面&#xff0c;而这个/var目录目前只分配10G的存储&#xff0c;导致节点存储报警。因此想修改docker的数据目录&…

关于pycharm无法进入base界面的问题

问题&#xff1a;terminal输入activate无法进入base 解决方案 1.Cortana这边找到Anaconda Prompt右击进入文件所在位置 2. 右击进入属性 3. 复制cmd.exe开始到最后的路径 cmd.exe "/K" C:\ProgramData\anaconda3\Scripts\activate.bat C:\ProgramData\anaconda3 …

工业数据的特殊性和安全防护体系探索思考

随着工业互联网的发展&#xff0c;工业企业在生产运营管理过程中会产生各式各样数据&#xff0c;主要有研发设计数据、用户数据、生产运营数据、物流供应链数据等等&#xff0c;这样就形成了工业大数据&#xff0c;这些数据需要依赖企业的网络环境和应用系统进行内外部流通才能…

STM32——时钟树与滴答计时器

STM32——时钟树与滴答计时器 使用的开发板为stm32F407VET6的芯片,主要介绍stm32的时钟树与滴答计时器的一些理论和一个自己编写的delay函数。 时钟树的结构图可以在STM32F4xx中文参考手册.pdf中的时钟这块找到。而滴答计时器是内核资源&#xff0c;需要到Cortex M3与M4权威指南…

Vue中的数据变化监控与响应——深入理解Watchers

目录 ​编辑 前言 1. 基本用法&#xff1a; 2. 深度监听&#xff1a; 3. 立即执行&#xff1a; 4. 监听多个数据&#xff1a; 5. 清理监听器&#xff1a; 6. 监听路由变化&#xff1a; 总结&#xff1a; 我的其他博客 前言 在Vue.js中&#xff0c;watch是一种用于监听…

【MATLAB】数据拟合第11期-基于粒子群迭代的拟合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 基于粒子群迭代的拟合算法是一种优化技术&#xff0c;它基于粒子群优化算法&#xff08;PSO&#xff09;的基本思想。该算法通过群体中个体之间的协作和信息共享来寻找最优解。 在基于粒…

vue3 插槽slot

插槽是子组件中的提供给父组件使用的一个占位符&#xff0c;用 <slot> 表示&#xff0c;父组件可以在这个占位符中填充任何模板代码&#xff0c;如 HTML、组件等&#xff0c;填充的内容会替换子组件的<slot> 元素。<slot> 元素是一个插槽出口 (slot outlet)&…

自由编程学习资源:free-programming-books

最近&#xff0c;我发现了一个在GitHub上备受欢迎的项目&#xff0c;它为程序员和编程爱好者提供了丰富、免费且高质量的学习资料&#xff0c;这就是"free-programming-books"。目前&#xff0c;这个项目在GitHub上已经有305k的star&#xff0c;显示出它在开发者社区…

分享66个JavaGame源码总有一个是你想要的

分享66个JavaGame源码总有一个是你想要的 学习知识费力气&#xff0c;收集整理更不易。 知识付费甚欢喜&#xff0c;为咱码农谋福利。 游戏下载链接&#xff1a;https://pan.baidu.com/s/1BUVmun2RhAY4vAMJwcY0mQ?pwd6666 提取码&#xff1a;6666 游戏项目名称 java实现…

千兆多模光模块SFP-GE-SX是什么?特点和应用领域有哪些?

千兆多模光模块SFP-GE-SX是一种用于光纤通信的光模块&#xff0c;用于传输千兆&#xff08;1 Gbps&#xff09;速率的数据。它使用多模光纤作为传输介质&#xff0c;并通过光信号来实现数据的传输。多模光纤是一种光纤&#xff0c;它具有相对较大的纤芯直径&#xff0c;通常为5…

UltraISO(软碟通)制作U盘启动盘完整教程

一、 准备工作 UltralSO 软件、ISO系统镜像、容量合适的U盘 二、详细步骤 首先&#xff0c;确保你已经安装了UltraISO软件&#xff0c;如果没有&#xff0c;可以从官方网站下载并安装。插入你的U盘&#xff0c;并确保U盘上没有重要的数据&#xff0c;先格式化优盘。然后打开…