【进程等待】是什么 | 为什么 | 怎么办 | wait阻塞等待

目录

进程等待是什么?

为什么要进程等待? 

如何进程等待?

wait 

阻塞等待 


进程等待是什么?

  • 进程终止会把进程退出的数据(退出码和退出信号)存放到进程的PCB中保存下来,让父进程进行等待。
  • 任何一个子进程在退出时,默认情况下,必须被父进程等待。
  • 任何子进程,在退出的情况下马,一般必须要被父进程进行等待。
  • 3号手册是库函数
  • 2号手册是系统调用函数

  • 若这个子进程的父进程被杀死或父进程不存在,则这个子进程被称为孤儿进程。
  • 孤儿进程会被OS领养,所以严格来讲父进程也存在,父进程就是OS。

  • 子进程在退出的时候,如果父进程不管不顾(父进程不等待)。

  • 子进程退出之后,就处于Z状态(僵尸状态),一直处于Z状态。

  • 很多进程处于Z状态且一直处于Z状态,进程的PCB存在非常大的占空间,非常大的结构体对象,则会造成内存泄露问题。

为什么要进程等待? 

 ❓为什么要进程等待

  • 为了获得子进程的退出信息(子进程的任务执行的结果怎么样用户需要知道)
  • 防止内存泄露
  1. 父进程通过等待,解决子进程退出的僵尸问题,回收系统资源(一定要考虑的)
  2. 获取子进程的退出信息,知道子进程是因为什么原因退出的(可选功能)
  • 后面有一些不用等待的场景,后面谈。

如何进程等待?

  • 父进程在子进程运行期间一般都在等待。
  • 父进程在子进程运行的期间也可以做别的事情,一般都让其等待。
  • 父进程等待子进程用系统调用函数
  • wait & waitpid 
  • man 2 wait/waitpid
  • 系统调用函数作用:等待一个子进程的状态发生变化
  • #include <sys/types.h>   #include <sys/wait.h>
  • pid_t wait(int *status);

  • pid_t waitpid(pid_t pid, int *status, int options);

  • wait() 和 waitpid() 是 Unix/Linux 系统调用,用于等待一个或多个子进程的终止。成功这些函数返回一个进程pid,表示已终止的子进程的pid。如果出错,则返回-1。
  • 参数后面也会详细讲解和举例。参数暂时设为NULL。

在Unix和Linux编程中,wait(或更常见的waitpid)函数用于使父进程等待一个或多个子进程结束,并获取其结束状态。这些函数的返回值和参数在不同的上下文中有所不同,但我会为你解释它们的基本含义。

waitpid 函数

waitpid函数的原型如下:

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

参数:

  • pid:要等待的子进程的ID。如果pid小于-1,则等待任何组ID等于abs(pid)的子进程。如果pid等于-1,则等待任何子进程。如果pid为0,则等待与调用进程同组的任何子进程。如果pid大于0,则等待进程ID等于pid的子进程。
  • status:一个指向整数的指针,该整数将接收关于子进程状态的信息。你可以使用宏(如WIFEXITEDWEXITSTATUSWIFSIGNALEDWTERMSIG等)来检查这个状态值。
  • options:影响函数行为的选项。常见的选项有WNOHANG(如果子进程没有结束,则立即返回),WUNTRACED(如果子进程因信号而停止,则也返回),以及WCONTINUED(如果子进程因SIGCONT信号而恢复,则也返回)。

返回值:

  • 如果成功,waitpid返回等待的子进程的PID。
  • 如果设置了WNOHANG并且没有子进程可用,则返回0。
  • 如果发生错误,则返回-1,并设置errno以指示错误。

wait 函数

wait函数是waitpid函数的一个特例,它仅等待任何子进程结束,而不提供额外的选项。

其原型如下:

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

这个函数的参数和返回值与waitpid类似,但没有pidoptions参数。

总的来说,waitwaitpid函数用于在父进程中同步子进程的结束,并获取其状态信息。这在需要处理子进程输出、检查其退出状态或确保子进程正确结束的场景中非常有用。

 

wait 

  • 请看下面代码☞☞
  • 父进程等待子进程耗费的时间❓
  • fork之后创建子进程,父子进程是同时执行各自的任务吗❓
  • main函数没有return或者exit也会终止吗❓
  • 子进程运行5ms退出,进程终止了
  • 父进程在子进程运行5ms是也sleep5ms,子进程终止之后,继续sleep5ms
  • 这里就存在一个5ms的窗口时间:子进程已经终止了,父进程还在休眠,短暂的看到子进处于僵尸状态,Z状态。
  • 当父进程结束休眠,等待子进程,可以看到子进程的僵尸状态消失了且PCB被回收了。
  • 以上就证明了等待是会解决子进程的僵尸问题的
  • 等待的本质就是:获取子进程退出信息(退出码&退出信号)并让OS把PCB释放掉(就是把子进程的Z状态☞X状态)
 myprocess.c  1 #include<stdio.h>2 #include<unistd.h>3 #include<string.h>4 #include<stdlib.h>5 #include<sys/types.h>6 #include<sys/wait.h>7 8 void ChildRun()9 {10   int cnt = 5;11   while(cnt--)12   {13     printf("I am child,pid: %d,ppid: %d,cnt: %d\n",getpid(),getppid(),cnt);14     sleep(1);                                                                                      15   }16 }17 18 int main()19 {20   printf("I am father,pid: %d,ppid: %d\n",getpid(),getppid());//父进程21   pid_t id = fork();22   if(id == 0)//child子进程23   {24     //子进程循环运行25     ChildRun();26     printf("Child quit...\n");27     exit(0);//终止进程,子进程直接僵尸28   }29   //子5s30   //父10s31   //father父进程,父进程在子进程运行期间先休眠10s再等待子进程....                                  32   sleep(10);33   pid_t rid = wait(NULL);34   if(rid > 0)35   {36     printf("wait success,rid: %d\n",rid);37   }38   sleep(3);39   printf("father quit ... \n");40 }

 

阻塞等待 

  • 我们修改以下代码,请看☞☞ 
  • 父进程在子进程运行期间5ms,一直在等待,没有做任何其他的事情。
  • 只有当子进程终止时(状态变化S☞☞Z时),父进程通过系统调用接口wait等待子进程,拿到子进程的PCB中的退出信息,告诉OS释放掉PCB。
  • 子进程没有终止之前,父进程一直处于阻塞等待中........
  • 子进程本身就是软件,父进程的本质时在等待某种软件条件就绪......(子进程终止,状态从S☞☞Z)
  • 前面我们也讲过阻塞状态,是某个进程等待硬件资源就绪,等待被调度,此进程的PCB处于该硬件资源的等待队列中,该进程处于阻塞状态。(类似理解)
  • 一个进程等待某种资源就绪
  1. 硬件资源就绪
  2. 软件条件就绪

如何理解父进程阻塞等待子进程条件就绪呢❓

  • 阻塞等待子进程
  • 父进程不在被调度,父进程的状态设为S状态。(休眠状态)
  • 父进程的PCB被链入到子进程的等待队列中。
  • 一旦子进程终止.....
  • OS就把等待队列中的父进程唤醒,父进程的状态设为R状态(运行状态)。
  • 继续向后执行。
  • 注意❗无论是硬件还是软件在操作系统OS中都是数据结构的对象,一切皆对象。(这个在后面C++中也会讲到)
myprocess.c1 #include<stdio.h>2 #include<unistd.h>3 #include<string.h>4 #include<stdlib.h>5 #include<sys/types.h>6 #include<sys/wait.h>7 8 void ChildRun()9 {10   int cnt = 5;11   while(cnt--)12   {13     printf("I am child,pid: %d,ppid: %d,cnt: %d\n",getpid(),getppid(),cnt);14     sleep(1);15   }16 }17 18 int main()19 {20   printf("I am father,pid: %d,ppid: %d\n",getpid(),getppid());//父进程21   pid_t id = fork();22   if(id == 0)//child子进程23   {24     //子进程循环运行25     ChildRun();26     printf("Child quit...\n");27     exit(0);//终止进程,子进程直接僵尸28   }        29   //father30   //父进程,父进程在子进程运行期间5ms一直在等待....31   pid_t rid = wait(NULL);32   if(rid > 0)                                                                                      33   {34     printf("wait success,rid: %d\n",rid);35   }36   sleep(3);37   printf("father quit ... \n");38 }

🙂感谢大家的阅读,若有错误和不足,欢迎指正。下篇讲解重点waitpid&非阻塞等待。

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

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

相关文章

【投稿资讯】区块链会议CCF C -- CoopIS 2024 截止7.10 附录用率

会议名称&#xff1a;CoopIS CCF等级&#xff1a;CCF C类学术会议 类别&#xff1a;人机交互与普适计算 录用率&#xff1a;2023年接收率21% (21 regular 10 work-in-progress papers/100) AREA 5: HUMAN-CENTRIC SECURITY AND PRIVACY IN INFORMATION SYSTEMS Access Con…

Linux网站服务

1.概念:HTML:超级文本编辑语言 网页:使用HTML,PHP,JAVA语言格式书写的文件。 主页:网页中呈现用户的第一个界面。 网站:多个网页组合而成的一台网站服务器。 URL:统一资源定位符&#xff0c;访问网站的地址。 网站架构:LAMP: LinuxApacheMYSQLPHP(系统服务器程序数据管理…

OpenHarmony 实战开发 - 如何在源码中编译复杂应用(4.0-Release)

文档环境 开发环境&#xff1a;Windows 11 编译环境&#xff1a;Ubuntu 22.04 开发板型号&#xff1a;DAYU 200&#xff08;RK3568&#xff09; 系统版本&#xff1a;OpenHarmony-4.0-Release 功能简介 在 OpenHarmony 系统中预安装应用的 hap 包会随系统编译打包到镜像中&a…

使用电路仿真软件教学的优势分析

随着科技的飞速发展&#xff0c;电子工程领域对人才的需求与日俱增。为了满足这一需求&#xff0c;教育者们不断探索着更加高效、直观的教学方法。电路仿真软件的出现&#xff0c;为电子工程教学注入了新的活力&#xff0c;它以其独特的优势&#xff0c;成为现代电子工程教育中…

啸叫抑制器采用什么处理芯片?ES56031或PH56031

会议系统或卡拉OK最头疼的就是啸叫了吧&#xff0c;来看看啸叫抑制器采用什么芯片 四通道啸叫抑制器&#xff0c;采用了2个电路板&#xff0c;每个板子处理2路信号&#xff0c;每块电路板有2个卡侬输入插座&#xff0c;2个卡侬输出插座 ES56031S&#xff0c;该啸叫抑制器为4通道…

请大数据把我推荐给正在申请小程序地理位置接口的人

小程序地理位置接口有什么功能&#xff1f; 若提审后被驳回&#xff0c;理由是“当前提审小程序代码包中地理位置相关接口( chooseAddress、getLocation )暂未开通&#xff0c;建议完成接口开通后或移除接口相关内容后再进行后续版本提审”&#xff0c;那么遇到这种情况&#x…

软件可靠度计算

软件的整体可靠度依据&#xff1a;若是单个就是当前部件的可靠度。若是多个部件&#xff0c;就需要多个部件的可靠度相乘。若是多个部件且有相同备份&#xff0c;那么计算公式更加不一样。 计算公式&#xff1a; 部件数&#xff1a;N 部件可靠度均为&#xff1a;R 单个部件的可…

树莓派4b测量光照强度

1.BH1750光照强度连接图 2. BH1750工作原理 BH1750的通讯过程 第1步:发送上电命令。 发送的过程和第2步基本一致,把测量命令(0x10)改成上电命令(0x01)。第2步:发送测量命令。 下面图片上的例子,ADDR引脚是接GND的,发送的测量命令是“连续高分辨率测量(0x10)”。 发送数据…

oc渲染器如何设置调渲染更快?oc云渲染加速助力

OC渲染器是Cinema 4D软件中广泛使用的渲染工具&#xff0c;它利用GPU进行硬件加速渲染&#xff0c;具备强大的计算性能。这使得它能够为产品和动画制作人员提供卓越的渲染质量。此外&#xff0c;OC渲染器还支持云渲染技术&#xff0c;这在需要进行大规模渲染任务时非常有用&…

【商业】SD NAND(贴片式TF卡)性能体验及应用

SD NAND【商业】   外观   NAND与TF卡的区别   雷龙CS SD NAND(贴片式TF卡)性能体验及应用   最后 SD NAND 外观正反示意图 NAND与TF卡的区别 什么是SD NAND&#xff1f;它俗称贴片式T卡&#xff0c;贴片式TF卡&#xff0c;贴片式SD卡&#xff0c;贴片式内存卡&am…

【贪心算法】哈夫曼编码Python实现

文章目录 [toc]哈夫曼编码不同编码方式对比前缀码构造哈夫曼编码哈夫曼算法的正确性贪心选择性质证明 最优子结构性质证明 总结 Python实现时间复杂性 哈夫曼编码 哈夫曼编码是广泛用于数据文件压缩的十分有效的编码方法&#xff0c;其压缩率通常为 20 % 20\% 20%到 90 % 90\%…

【C++】——内存管理

&#x1f600;&#x1f600;前言 好久没更新了&#xff0c;五一小长假&#xff0c;有点玩脱了&#xff0c;今天赶紧补一篇博客&#xff0c;回回状态 一 c/c内存分配 下面看下面一段代码 #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; i…

数据可视化训练第一天(matplotlib直线;散点图,随机漫步)

前言 本人自己的练习记录&#xff1b;如有错误请指正&#xff1b; https://matplotlib.org/stable/gallery/lines_bars_and_markers/index.html 官方有许多例子&#xff0c;可以找到自己需要的图像模仿进行绘制 1.一个简单的直线例子 就如同我们学习C语言的第一个helloword时…

STM32 PM2.5(GP2Y1014AU0F)空气质量 传感器

此工程是基于江科大源码的基础上创作&#xff0c;因为pm2.5这个模块比较冷门&#xff0c;参考的代码比较少&#xff0c;所以开源给大家学习参考&#xff01; 功能介绍 GP2Y10传感器模块模块原理&#xff1a;GP2Y1014AU0F是利用光散射发来测量空气中PM2.5的传感器&#xff0c;在…

Java集合进阶——集合体系结构及各个集合的方法

Java种的集合分为单列集合和双列集合&#xff0c;单列集合的最高层接口是Collection&#xff0c;双列集合的最高层是Map&#xff0c;这里先介绍单列集合 单列集合 体系结构&#xff1a; 注&#xff1a;红色框都为接口&#xff0c;蓝色框都为实现类&#xff08;实现类Vector已…

地平线的花样年华

北京车展在这个喧闹的“五一”假期落幕了&#xff0c;它留给我们许多思考。 虽然社会面的传播焦点落在了“网红”两个字上&#xff0c;但技术的更新依然如暗流涌动&#xff0c;给这届北京车展写下注脚。整个过程前后&#xff0c;最重要和吸引了最多目光的&#xff0c;是智驾&a…

什么是驱动数字签名?如何获取驱动数字签名?

Windows 驱动程序承载着计算机实现的各种内核和用户模式功能。如果驱动程序被黑客攻击&#xff0c;可能会产生很多问题。Windows通过数字签名来验证驱动程序包的完整性及发布者的身份。2020年10月的安全更新中&#xff0c;微软加强了对驱动软件的验证&#xff0c;如果Windows无…

【数据可视化-01】Matplotlib图形实战宝典

在数据分析领域&#xff0c;图形化展示数据是非常重要的环节。Python中的matplotlib库是绘制各类图形的强大工具。本文将介绍如何使用matplotlib绘制折线图、直方图、饼图、散点图和柱状图等数据分析中常见的图形&#xff0c;并附上相应的代码示例&#xff0c;可以当初matplotl…

栈和队列的4道面试题【详细解析】【代码实现】

栈和队列的面试题 1.有效的括号&#xff08;栈实现&#xff09; 题目&#xff1a; 有效的括号 给定一个只包括 (&#xff0c;)&#xff0c;{&#xff0c;}&#xff0c;[&#xff0c;] 的字符串 s &#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必…

系统稳定性判定分析(二)----频域分析法相关辐角原理

文章目录 辐角原理&#xff08;即Cauchy原理&#xff09;引理分析辐角原理定义与证明补充知识 参考文献 为后续更好从频域层面分析控制系统的稳定性&#xff0c;本节首先介绍在后续分析中用到的辐角原理。 根据复变函数对数的定义&#xff0c;有 l n f ( z ) l n ∣ f ( z ) ∣…