【Linux】进程(9):进程控制2(进程等待)

news2024/10/1 1:19:31

大家好,我是苏貝,本篇博客带大家了解Linux进程(9)进程控制2,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
在这里插入图片描述


目录

  • 一. 为什么要进程等待
  • 二. 如何进行进程等待
    • 1.wait函数—系统调用
    • 2. waitpid函数
      • (A).第一个参数:pid_t pid
      • (B).第二个参数:int* status
        • a. 第二个参数是输出型参数
        • b. 这个参数表示子进程的退出信息(包括子进程的退出码和退出信号)
        • c. WIFEXITED 和 WEXITSTATUS
      • (C).第三个参数:int options

结论:任何子进程,在退出的情况下,一般必须要被父进程进行等待。进程在退出时的状态变为Z(僵尸状态),如果父进程不管不顾,那么子进程的task_struct一直存在而且所占的空间较大,造成内存泄露的问题

一. 为什么要进程等待

  1. 父进程通过等待,解决子进程退出的僵尸问题,回收系统资源(一定要考虑的)
  2. 获取子进程的退出信息,知道子进程是因为什么原因退出的(可选的功能)

二. 如何进行进程等待

1.wait函数—系统调用

先来查看一下wait函数,从头文件就可以看出,wait函数是系统调用函数。作用:等待任意一个子进程退出
在这里插入图片描述

函数的参数暂时不用管,(我们下面说waitpid中会说到)可以直接传NULL
函数的返回值是父进程等待子进程,等待成功时,子进程的pid

修改.c文件
在这里插入图片描述

上面代码的意思是先用fork函数生成一个子进程,子进程会执行ChildRun函数,执行完成后,进程终止。此时子进程是Z状态(僵尸状态)。睡眠8秒后,父进程等待子进程退出,子进程已经退出,wait函数得到子进程的pid,解决子进程退出的僵尸问题。父进程再睡眠5秒后父进程终止

在这里插入图片描述

所以wait函数是能解决子进程退出的僵尸问题

父进程在执行wait函数时,如果子进程没有退出,那么父进程一直在进行阻塞等待。阻塞?我们之前了解的阻塞是等待某种硬件资源(如键盘资源)就绪,等待时是将进程的pcb链入键盘资源的等待序列中。那我们如何理解阻塞等待子进程?

阻塞等待:将父进程的状态设为S,再链入子进程的队列中(子进程本身就是软件)。
一旦子进程退出,操作系统调度时发现子进程退出,就将父进程唤醒

2. waitpid函数

先查看waitpid函数
在这里插入图片描述

我们看见waitpid函数有3个参数

(A).第一个参数:pid_t pid

第一个参数:等待的子进程的pid。如果pid==-1,表示等待任意一个子进程,与wait等效。pid>0表示等待其进程ID与pid相等的子进程

(B).第二个参数:int* status

a. 第二个参数是输出型参数

什么是输出型参数?我们自己在代码中定义一段内存空间,把空间的地址传进来。操作系统在等待时,在底层把对应的数据通过传的指针带到用户层,让用户看到。

直接举例:
在这里插入图片描述

我们在代码中定义变量a,将a的地址通过sacnf传到操作系统,我们键盘输入的数据经过scanf函数读到了a中,最后我们可以通过打印看到a的值

b. 这个参数表示子进程的退出信息(包括子进程的退出码和退出信号)

如果只要子进程的退出码和退出信号的话,能不能直接定义2个全局变量exit_code和exit_signal,然后将退出码和退出信号分别写在exit_code和exit_signal呢?

当然不能,因为进程具有独立性,子进程写入时,会先发生写时拷贝,所以父进程看不到子进程写入的数据,因此不能使用全局变量来接收退出码和退出信号

我们来见一下这个退出信息

修改.c文件

在这里插入图片描述

status=256,这是什么意思呢?
在这里插入图片描述

status不能简单的当作整形来看待,可以当作位图来看待。status是int类型的,有32个比特位,只研究status低16比特位。其中次8个比特位表示退出状态,即退出码。前7个比特位表示退出信号,第8个比特位暂时不用理解
在这里插入图片描述

因此status=256=2^8即0000 0001 0000 0000,所以退出码=1,退出信号=0

我们如何通过代码直接打印出退出码和退出信号呢?
退出码是次8位,那我们先status>>8,再&(按位与)0xFF(即0x1111 1111)
退出信号:status & 0x7F(即0x0111 1111)

修改.c文件
在这里插入图片描述

退出码是exit函数的参数:123
因为进程没有异常,所以退出信号=0
在这里插入图片描述

让子进程死循环,在命令行中使用kill -9信号杀掉子进程
在这里插入图片描述
在这里插入图片描述

c. WIFEXITED 和 WEXITSTATUS

上面是通过将status右移或按位与得到子进程的退出码和退出信号,那有没有什么东西能够直接告诉我们退出码和退出信号呢?

WIFEXITED(status): 若为正常终止子进程返回的状态,则为真。(若退出信号为0,则为真;反之则为假)
WEXITSTATUS(status): 若WIFEXITED非零(退出信号为0),提取子进程退出码。(查看进程的退出码)

修改.c文件
在这里插入图片描述

上面代码的意思是,如果子进程代码跑完了,即正常退出,那么查看子进程的退出码。如果子进程不正常退出,提示一下。我们之前写的status右移和按位与没删除是想看看2个框框内的结果是否一致
在这里插入图片描述

结果是一致的。

我们再来看看进程不正常退出的情况,之前的.c文件只修改ChildRun函数,让里面有野指针
在这里插入图片描述

结果也是正确的,因为有野指针,所以是段错误,退出信号为11

在这里插入图片描述

(C).第三个参数:int options

我们上面讲的,都是如果子进程没有退出,那么父进程在执行waitpid时在阻塞等待,这表示在等待期间,父进程其它事情什么都没有干。那如果我们想让父进程做一些其它的事情呢?这就需要用到waitpid函数的第三个参数:int options

当第三个参数为0时,表示父进程要阻塞等待。为WNOHANG时,表示非阻塞等待:每隔一段时间就会查看子进程是否退出,如果没有退出,那就可以做其它事情。因为每隔一段时间就要查看子进程是否退出,所以非阻塞等待要配合循环一起使用,这就叫非阻塞轮询

讨论一下waitpid函数的返回值rid

  1. rid>0:等待成功,子进程退出,父进程回收成功
  2. rid<0:等待失败,可能是第一个参数有问题,等待的子进程a不是父进程b的子进程
  3. rid==0:检测是成功的(子进程a是父进程b的子进程),但是进程还没有退出,需要下一次进行重复等待

先来试试非阻塞等待,父进程暂时不做其它事情
在这里插入图片描述

在这里插入图片描述


好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️

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

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

相关文章

学习嵌入式对于学历有要求吗?

学习嵌入式系统开发通常并不对学历有严格的要求&#xff0c;尤其是在技术行业中&#xff0c;实际的技能和经验往往比学历更为重要。我收集归类了一份嵌入式学习包&#xff0c;对于新手而言简直不要太棒&#xff0c;里面包括了新手各个时期的学习方向编程教学、问题视频讲解、毕…

设计无缝体验:交互设计流程全解析

完整的产品交互设计流程是什么&#xff1f;完整的产品交互设计流程包括研究用户需求、指定信息架构、制作产品原型、进行用户测试和实时发布产品。交互设计就是从人与产品之间的关系入手&#xff0c;通过产品设计来满足大众的日常需求。随着网络技术的流行&#xff0c;产品交互…

高性能Python网络框架实现网络应用详解

概要 Python作为一种广泛使用的编程语言,其简洁易读的语法和强大的生态系统,使得它在Web开发领域占据重要位置。高性能的网络框架是构建高效网络应用的关键因素之一。本文将介绍几个高性能的Python网络框架,详细描述它们的特点、使用场景及具体示例代码,帮助高效实现网络应…

鸿蒙语言基础类库:【@ohos.util.ArrayList (线性容器ArrayList)】

线性容器ArrayList 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 …

windows USB 设备驱动开发-USB带宽

本文讨论如何仔细管理 USB 带宽的指导。 每个 USB 客户端驱动程序都有责任最大程度地减少其使用的 USB 带宽&#xff0c;并尽快将未使用的带宽返回到可用带宽池。 在这里&#xff0c;我们认为USB 2.0 的速度是480Mbps、12Mbps、1.5Mbps&#xff0c;这分别对应高速、全速、低速…

Mysql 高性能索引

引言 索引是一种用于快速查询和检索数据的数据结构&#xff0c;其本质可以看成是一种排序好的数据结构。 常见的索引类型包括B-Tree索引、哈希索引、空间数据索引&#xff08;R-Tree&#xff09;、全文索引。 索引的类型 在MySQL中&#xff0c;索引是在 存储引擎层 而不是服…

分享五款软件,成为高效生活的好助手

​ 给大家分享一些优秀的软件工具,是一件让人很愉悦的事情&#xff0c;今天继续带来5款优质软件。 1.图片放大——Bigjpg ​ Bigjpg是一款图片放大软件&#xff0c;采用先进的AI算法&#xff0c;能够在不损失图片质量的前提下&#xff0c;将低分辨率图片放大至所需尺寸。无论…

C 语言中如何进行冒泡排序?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01; &#x1f4d9;C 语言百万年薪修炼课程 通俗易懂&#xff0c;深入浅出&#xff0c;匠心打磨&#xff0c;死磕细节&#xff0c;6年迭代&#xff0c;看过的人都说好。 文章目…

cesium 雷达扫描

cesium 雷达扫描 (下面附有源码) 实现思路 1、通过改变圆型材质来实现效果, 2、用了模运算和步进函数(step)来创建一个重复的圆形图案 3、当纹理坐标st落在垂直或水平的中心线上时,该代码将改变透明度和颜色,以突出显示这些线 示例代码 <!DOCTYPE html> <ht…

python开发prometheus exporter--用于hadoop-yarn监控

首先写python的exporter需要知道Prometheus提供4种类型Metrics 分别是&#xff1a;Counter, Gauge, Summary和Histogram * Counter可以增长&#xff0c;并且在程序重启的时候会被重设为0&#xff0c;常被用于任务个数&#xff0c;总处理时间&#xff0c;错误个数等只增不减的指…

【深度学习】LeNet原理及代码实现

目录 1.原理及介绍 2.代码实现 2.1model.py 2.2model_train.py 2.3model.test.py 1.原理及介绍 2.代码实现 2.1model.py import torch from torch import nn from torchsummary import summaryclass LeNet(nn.Module):def __init__(self):super(LeNet, self).__init__…

高智能土壤养分检测仪:农业生产的科技新助力

在科技日新月异的今天&#xff0c;农业领域也迎来了革命性的变革。其中&#xff0c;高智能土壤养分检测仪作为现代农业的科技新助力&#xff0c;正逐渐改变着传统的农业生产方式&#xff0c;为农民带来了前所未有的便利与效益。 高智能土壤养分检测仪&#xff0c;是一款集高科技…

grep对文件内容搜索(附重要拓展-正则表达式)

文件搜索是搜索查找符合条件的某文件的目录&#xff0c;若要编辑文件或对文件的某配置进行修改&#xff0c;就需要对文件内容进行搜索。 grep 命令是 Linux 及类 Unix 操作系统中的一个强大的文本搜索工具&#xff0c;用于搜索一个或多个文件中匹配给定模式的行。grep 代表“Gl…

深入剖析数据库索引

写在前面&#xff1a; 此博客内容已经同步到我的博客网站&#xff0c;如需要获得更优的阅读体验请前往https://mainjaylai.github.io/Blog/blog/database 文章目录 如何验证我们正在使用InnoDB引擎 主键如果你没有自己创建任何主键会发生什么&#xff1f;关键字和索引之间的区别…

基于SpringBoot+Hadoop+python的物品租赁系统(带1w+文档)

基于SpringBootHadooppython的物品租赁系统(带1w文档) 基于SpringBootHadooppython的物品租赁系统(带1w文档) 物品租赁系统是电子、信息技术相结合&#xff0c;是一种必然的发展趋势。以互联网为基础&#xff0c;以服务于广大用户为目的&#xff0c;发展整体优势&#xff0c;扩…

经典双通道比较器LM393、LM393B、LM2903B、LM193、LM293和LM2903介绍及输入输出仿真

前言&#xff1a; LM393 SOP8封装的外观与丝印 LM393出现几十年了&#xff0c;是一款经典的双比较器&#xff0c;非常经典&#xff0c;用的比较多&#xff0c;新的比较器大家也要多关注。 该类型比较器&#xff0c;虽然静态电流较小&#xff0c;但在电池电路中耗电是巨大的&…

学习笔记——动态路由——IS-IS中间系统到中间系统(IS-IS工作过程)

六、IS-IS工作过程 1、第一步&#xff1a;建立邻居关系 IS-IS网络中所有路由器之间实现通信&#xff0c;主要通过以下几个步骤&#xff1a; (1)邻居关系建立&#xff1a; 邻居关系建立主要是通过HELLO包交互并协商各种参数&#xff0c;包括链路类型(level-1/level-2)&#…

hdfs大规模数据存储底层原理详解(第31天)

系列文章目录 一、HDFS设计原理 二、HDFS系统架构 三、HDFS关键技术 四、HDFS应用实例 五、解决HDFS不能处理小文件详解问题 文章目录 系列文章目录前言一、设计原理二、系统架构三、关键技术四、应用实例五、解决HDFS不能处理小文件详解问题1. 合并小文件2. 优化Hive配置3. 使…

乐器培训课程报名小程序模板源码

模板介绍 一款实用的音乐课程&#xff0c;乐器培训&#xff0c;艺术类网页课程报名手机小程序模板下载。包含&#xff1a;主页、列表、个人中心、报名等模块。 图片演示 乐器培训课程报名小程序模板源码

Oracle基础以及一些‘方言’(一)

1、什么是Oracle ORACLE数据库系统是美国ORACLE公司&#xff08;甲骨文&#xff09;提供的以分布式数据库为核心的一组软件产品&#xff0c;是最流行的客户/服务器(CLIENT/SERVER)或B/S体系结构的数据库之一。 ORACLE 通常应用于大型系统的数据库产品。 ORACLE 数据库是目前世界…