【进程等待】是什么 | 为什么 | 怎么办 | 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   //子5s
 30   //父10s
 31   //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.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   //father
 30   //父进程,父进程在子进程运行期间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&非阻塞等待。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

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…

Java毕业设计 基于SpringBoot vue社区智慧养老监护管理平台

Java毕业设计 基于SpringBoot vue社区智慧养老监护管理平台 SpringBoot 社区智慧养老监护管理平台 功能介绍 登录注册 个人中心 修改密码 个人信息 房间信息管理 房间入住信息管理 反馈信息管理 留言管理 老人信息管理 公告管理 物资申请管理 管理员管理 护工管理 体检员管理…

浅谈Windows 上的线程亲和性(Thread affinity)

​ 前言 线程属性包括是否分离、亲和性、调度策略和优先级等。Linux默认的调度策略是CFS(完全公平调度算法),而 Windows 是基于优先级抢占式的策略。 在这些方面,Windows 和 Linux 差异巨大。本文仅针对 Windows 系统的线程亲和性进行探讨。 线程亲和性(Thread affinity) 什…

解锁AI的神秘力量:LangChain4j带你步入智能化实践之门

关注微信公众号 “程序员小胖” 每日技术干货&#xff0c;第一时间送达&#xff01; 引言 在数字化转型的浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;正逐渐成为推动企业创新和增长的关键力量。然而&#xff0c;将AI技术融入到日常业务流程并非易事&#xff0c;它…

谷歌月球模型

收费产品&#xff0c;白嫖党勿扰 收费金额500元 1 概述 前些时间&#xff0c;有个客户&#xff0c;想fight TAIWAN&#xff0c;于是乎&#xff0c;我把谷歌地球整个台湾的模型都下载下来了&#xff0c;大约300GB。今天&#xff0c;又有个客户&#xff0c;提出一个过分要求&…

【第14章】spring-mvc之ajax

文章目录 前言一、准备二、单个值1.前端2.后端3. 结果 三、对象1.前端2.后端3. 结果 四、JSON对象1.前端2.后端3. 结果 五、JSON数组1.前端2.后端3. 结果 总结 前言 AJAX&#xff08;Asynchronous JavaScript and XML&#xff09;是一种用于创建快速动态网页的技术&#xff0c…

STM32:GPIO输入输出

文章目录 1、GPIO介绍1.1 GPIO的基本结构1.1 GPIO的位结构 2、 GPIO工作模式3、GPIO标准外设库接口函数3.1 RCC接口函数3.2 GPIO接口函数3.2.1 GPIO的读取函数3.2.1 GPIO的写入函数 4、GPIO的初始化 1、GPIO介绍 GPIO&#xff08;General Purpose Input Output&#xff09;通用…

深入大模型量化技术,大模型端侧落地已Ready?

揭秘未来&#xff1a;大模型量化技术如何革新移动AI应用 ©作者|饮水机 来源|神州问学 前言 最近&#xff0c;苹果发布了OpenELM系列模型&#xff0c;参数规模分别为270M、450M、1.1B和3B。与此同时&#xff0c;微软也推出了Phi-3系列模型&#xff0c;其中mini版本的参数…

支付时,中国网联结算与中国银联结算的区别与联系

随着电子商务和互联网支付的快速发展&#xff0c;中国的支付清算市场也呈现出前所未有的繁荣景象。在这个大背景下&#xff0c;中国网联与中国银联作为两大支付清算机构&#xff0c;各自扮演着重要的角色。本文将对两者的区别和联系进行深入探讨&#xff0c;以期对读者有更全面…

【北京迅为】《iTOP-3588开发板快速烧写手册》-第9章ubuntu系统下升级固件

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

智慧公厕,城市现代化公卫变革的关键节点

随着城市的快速发展&#xff0c;公共厕所作为社会基础民生设施&#xff0c;正越来越受到精细化管理的重视。智慧公厕的出现&#xff0c;为传统公共厕所的脏乱臭提供了解决方案&#xff0c;通过物联网、大数据、云计算、自动化控制等先进技术的贡献&#xff0c;使公厕管理更加高…

怎么编辑百度百科个人词条

辑百度百科个人词条是一个相对复杂的过程&#xff0c;需要遵循一定的步骤和规则。以下是百科优化网整理的编辑百度百科个人词条的步骤和注意事项。 1. 确定编辑资格 百度百科个人词条的编辑权主要赋予那些具有一定影响力的公众人物&#xff0c;或者是有一定“身份”的人物&…

大模型驱动的新一代 BI 平台,Sugar BI 开启智慧决策新模式

本文整理自 2024 年 4 月 16 日的 2024 百度 Create 大会上的《大模型驱动的新一代 BI 平台如何开启智慧决策》分享。 全文包括了可视化 BI 分析技术架构、智能图表推荐策略与规则设计、Sugar Bot 智能问数的技术实现流程&#xff0c;以及目前的场景应用等。 1 Sugar BI 产…

【C语言】路漫漫其修远兮,深入[指针]正当下

一. 指针初步 1.概念定义 地址&#xff1a;我们在内存中开辟空间时&#xff0c;为了方便后续访问&#xff0c;每个数据有确切的地址。 指针&#xff1a;指向数据的地址&#xff0c;并将其地址储存在指针变量中。 2.基本运算符 • 取地址操作符&#xff08;&&#xff09; …

OpenHarmony 4.0 实战开发——分布式软总线解析:设备发现与传输

OpenHarmony 的分布式软总线子系统为 OpenHarmony 系统提供的通信相关的能力&#xff0c;包括&#xff1a;WLAN 服务能力、蓝牙服务能力、软总线、进程间通信 RPC&#xff08;Remote Procedure Call&#xff09;等通信能力。 其中主要包括&#xff1a; WLAN 服务&#xff1a;…

【Java开发的我出书啦,各位同仁快过来围观】!!!

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容出书的目的出书的过程书籍的内容 &#x1f4e5;博主的话 &#x1f50a;博主介绍 文章目录 &#x1f50a;博主介绍&#x1f964;本文内容出书的目的出书的过程书籍的内容 &#x1f4e5;博主的话 &#x1f33e;阅读前&#x…

机器学习 | 时间序列预测中的AR模型及应用

自回归模型&#xff0c;通常缩写为AR模型&#xff0c;是时间序列分析和预测中的一个基本概念。它们在金融、经济、气候科学等各个领域都有广泛的应用。在本文中&#xff0c;我们将探索自回归模型&#xff0c;它们如何工作&#xff0c;它们的类型和实际例子。 自回归模型 自回…

Elasticsearch中的三种分页策略深度解析:原理、使用及对比

码到三十五 &#xff1a; 个人主页 在Elasticsearch中&#xff0c;分页是查询操作中不可或缺的一部分。随着数据量的增长&#xff0c;如何高效地分页查询数据急需需要面对的问题。Elasticsearch提供了三种主要的分页方式&#xff1a;from size、scroll和search_after。下面详细…

ICode国际青少年编程竞赛- Python-2级训练场-基础训练4

ICode国际青少年编程竞赛- Python-2级训练场-基础训练4 1、 for i in range(4):if i > 2:Flyer[i].step(3)else:Flyer[i].step(1) Dev.step(Item[3].x - Dev.x)2、 for i in range(6):if i < 3:Flyer[i].step(2)else:Flyer[i].step(3) Dev.step(Item[2].x - Dev.x)3、 …

制造版图大变革!逾10座晶圆厂蓄势待发 | 百能云芯

在全球半导体产业的激烈竞争和市场需求的复杂波动中&#xff0c;晶圆厂建设热潮正在美国兴起&#xff0c;这一波建设浪潮的核心动力之一&#xff0c;便是美国政府推出的《芯片与科学法案》所承诺的巨额补贴&#xff0c;旨在提升美国在全球半导体行业的竞争力。 当地时间4月25日…