【Linus】进程的等待

news2024/11/26 4:35:29

进程等待的必要性

  • 如果子进程退出了,父进程没有对子进程进行回收,子进程就会进入僵尸进程,占用内存,导致内存泄漏
  • 如果程序进入僵尸状态,那么kill -9 也无法强制杀死进程
  • 子进程是父进程创建出来,完成父进程交代的特殊任务,需要告知父进程完成与否,完成如何
  • 父进程通过进程等待回收子进程,获取子进程的退出状态

进程等待方法

1).wait

wait:

pid_t wait (int *status);

返回值:等待成功 返回被等待进程pid  ,失败返回-1

参数:   输出型参数,获取子进程退出状态,不关心设为NULL

作用 :  等待任意子进程

验证wait

 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<sys/wait.h>
  4 #include<sys/types.h>
  5 #include<stdlib.h>
  6 int main()
  7 {
  8   pid_t id =fork();
  9   if(id==0)
 10   {
 11     int i=5;
 12     while(i--)
 13     {
 14       printf("I am child ,pid=%d,i=%d\n",getpid(),i);
 15       sleep(1);
 16     }
 17     exit(0);
 18   }
 19   else
 20   {
 21     sleep(10);
 22     pid_t ret_id =wait(NULL);
 23     printf("father wait success ,wait id =%d\n",ret_id);
 24     sleep(5);
 25     printf("father exit!\n");
 26   }
 27   return 0;
 28 }
 29                                                                                                                  
 30 

在进程中,创建一个子进程

运行逻辑如下:

子进程运行五秒 随后五秒内进入僵尸进程,僵尸进程被回收,父进程等待结束,输出等待结果,再过五秒,父进程退出。

通过终端对进程监视:
bdda1643fbc1487cb5d8ae3e80529c1d.png

结论:父进程通过等待 回收僵尸进程

2).waitpid

waitpid

pid_ t waitpid(pid_t pid, int *status, int options);

返回值:

>0 表示成功

==0  设置WNOHUNG并且无已退出的子进程收集会返回0

-1   调用错误

pid

-1  等待任一个进程

>0 等待进程pid与pid相同的进程 

  

重点介绍:status

输出型参数,类似一个返回值,获取子进程的退出信号和退出码。

从操作系统中取出特定的数据:
008eed06497d4b1f8ec7ab0f72b44fe2.png

这一过程描述为:

子进程退出时,将自己的退出信息写入自己的pcb task_stuck  释放代码数据,更改状态为Z,进入僵尸状态。父进程调用wait 或者waitpid 等待 如果进程是僵尸状态,则父进程立马进行回收,(否则父进程进入阻塞状态)回收子进程pcb里的退出码拿到 ,放在status中

获取子进程status

status 不是简单的整形 应当做位图来看待(只研究低16位)

3389fd621c8743ef87647e4944a40cc1.png

在进程正常终止时 高8位表示退出状态 ,即退出码,低7位是0 ,表示成功结束

当信号被kill时 它的退出码是没有意义的,我们不关心,关心它终止信号

因此得到退出码和终止信号的方式就是位运算

exitCode=(status>>8)&0xff;
exitSignal=status&0x7f;

因此,系统提供俩个宏来获取退出码和终止信号

exitNormsl=WIFEXITED(status) //检查是否正常退出

exitCode=WEXISTATUS(status)  //查看进程的退出码

简单示例

3e0ef8ba346040379a7664e9c0c6b151.png

该进程正常结束

结果:
18708b9ac500417db65b622983123b7b.png

正常结束的退出码就算子进程返回时带的,退出信号为0

在子进程运行时,利用kill -9杀死子进程 

140b96fe8127487c9d206c6281e8bb32.png

被异常杀死的进程退出码无意义,退出信号是killl 信号

问:status为什么不能是全局变量,非得是宏?

如果是全局变量,那么在物理地址会发生写时拷贝,产生俩份数据,父进程无法得到子进程的数据,宏调用为操作系统提供。

阻塞等待

waitpid的最后一个参数options,其为0时,就是阻塞等待;WNOHANG时,为非阻塞等待

  • 如果子进程不退出,父进程就一直等待
  • 如果调用函数未结束(软硬条件不具备),进程就进入阻塞状态,一直等待

当某个进程在系统层面等待某件事情发生时,当前进程的代码和数据无法运行,进程需要等待,经常pcb就由R状态修改为S状态,从运行队列链接到等待队列中。当经常等待信号被接收到,进程就有S->R,由等待队列链接到运行队列

非阻塞等待

非阻塞轮询:

为了防止子进程一直不退出,父进程一直在等待,非阻塞轮询,使父进程在没有等到子进程的退出信号时,也可以去做别的事

在大多情况下,是使用阻塞等待,非阻塞轮询只作为了解。

                                  

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

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

相关文章

介绍比特币上的 sCrypt 开发平台

最强大的基础设施和工具套件&#xff0c;可轻松构建和扩展您的 dApp 杀手级应用在哪里&#xff1f; 尽管比特币在小额支付、国际汇款和供应链管理等广泛用例中具有颠覆性潜力&#xff0c;但在推出 14 年后&#xff0c;我们还没有看到一款非常受欢迎并被主流采用的杀手级应用。 …

Star History 十月开源精选 |AI for Postgres

在 2023 年 Stack Overflow 开发者调查中&#xff0c;Postgres 顶替了 MySQL 被评为最受欢迎的数据库。一个重要因素应该是 Postgres 支持扩展&#xff1a;可扩展的架构 Postgres 仍然由社区拥有&#xff0c;Postgres 生态近年来蓬勃发展。 扩展可以看作是内置功能&#xff0c…

基于SpringBoot的超市信息管理系

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着我国经济的不断发…

使用 OpenCV 发现圆角矩形的轮廓

OpenCV - 如何找到圆角矩形的矩形轮廓? 问题: 在图像中,我试图找到矩形对象的圆角轮廓。然而,我对两者的尝试 HoughLinesP 并 findContours 没有产生预期的结果。 我的目标是找到一个类似于以下形状的矩形: 。 代码: import cv2 import matplotlib.pyplot as plt…

深入理解Transformer,兼谈MHSA(多头自注意力)、LayerNorm、FFN、位置编码

Attention Is All You Need——集中一下注意力 Transformer其实不是完全的Self-Attention结构&#xff0c;还带有残差连接、LayerNorm、类似1维卷积的Position-wise Feed-Forward Networks&#xff08;FFN&#xff09;、MLP和Positional Encoding&#xff08;位置编码&#xf…

H5标签的contenteditable属性在项目种的使用

介绍 contenteditable 是 HTML5 中的新属性。属性值为true 可以编辑元素内容&#xff0c;false 无法编辑元素内容。 简单说: div标签&#xff0c;加上这个属性&#xff0c;就变成可以编辑状态。 <p contenteditable"true">这里可编辑</p>属性可以开发的…

SAP Smartforms设计

第八章 SMART FORMS设计 要点列表 概览&#xff1b; Form&#xff08;表格&#xff09;&#xff1b; Smart Styles&#xff08;样式&#xff09;&#xff1b; Text Module&#xff08;文本模块&#xff09;&#xff1b; 使用标准表方式打印&#xff1b; 使用模板方式打印…

C语言基础篇5:指针(二)

接上篇&#xff1a;C语言基础篇5&#xff1a;指针(一) 4 指针作为函数参数 4.1 指针变量作为函数的参数 指针型变量可以作为函数的参数&#xff0c;使用指针作为函数的参数是将函数的参数声明为一个指针&#xff0c;前面提到当数组作为函数的实参时&#xff0c;值传递数组的地址…

java中SPI机制

一&#xff1a;作用 SPI的作用其实就是&#xff0c;在系统内部&#xff0c;定义一个能力接口&#xff0c;该接口可以满足自己的业务需要&#xff0c;比如发送短信&#xff0c;定义一个发送短信的接口&#xff0c;至于用什么方式实现&#xff0c;可以交给短信服务提供商去实现&…

[C/C++]数据结构 堆排序(详细图解)

一:前言 在[C/C]数据结构 堆的详解中,介绍了什么是堆,并且完成了堆的实现和一系列接口,包括向上调整法和向下调整法等,接下来小编介绍一个有点量级的排序方法------堆排序,时间复杂度为O(n*lgn) 二:堆排序详解 2.1 方法介绍 1.首先将待排序数组建为大堆,此时堆顶元素就为数组…

肖sir __数据库练习__001

建表语句&#xff1a; create table student ( id int(4),age int(8),sex int(4),name varchar(20), class int(4), math int(4)) DEFAULT charsetutf8; INSERT into student VALUES(1,25,1,‘zhansan’,1833,90); INSERT into student VALUES(2,25,1,‘lisi’,1833,67); INSER…

Windows安装Docker、自定义安装目录

目录 前言一、Docker安装包下载二、自定义Docker安装路径、设置到其他盘三、安装Docker四、安装后配置1.修改镜像保存路径2.自定义镜像源 五、Docker运行验证1.docker/welcome-to-docker2.MySQL服务 总结 前言 Docker是一种开源的容器化平台&#xff0c;可以让开发者使用容器的…

异步爬虫提速实践-在Scrapy中使用Aiohttp/Trio

在构建爬虫系统时&#xff0c;提高爬虫速度是一个关键问题。而使用异步爬虫技术可以显著提升爬取效率。在本文中&#xff0c;我将与大家分享如何在Scrapy中利用Aiohttp或Trio库实现异步爬取&#xff0c;以加快爬虫的速度。让我们开始吧&#xff01; 1. 安装所需的库 首先&…

MyBatis-Plus及多数据源入门教程

开发环境配置 JDK 1.8、Maven 3.8.8、 IDEA CE 2023.2、MySQL 8.0.34 框架介绍 MyBatis-Plus&#xff08;简称 MP&#xff09;是一个 MyBatis的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。MyBatis 是一款非常优秀的开源…

企业级应用场景中,LLM 的数据特性剖析及处理对策

编者按&#xff1a;今年以来&#xff0c;大语言模型&#xff08;LLM&#xff09;在消费者(2C)市场崭露头角&#xff0c;同时也吸引了大量企业的关注。但是直接将这些面向消费者的模型引入企业环境&#xff0c;可能会面临一些风险。今天我们为大家带来的这篇文章&#xff0c;作者…

GPTs 初体验 - 1 分钟就能创建一个自己的 ChatGPT? | 京东云技术团队

就在 11.10 号早上&#xff0c;ChatGPT 已经偷摸的把GPTs功能&#xff0c;开放给所有尊贵的 Plus 用户了。 随着这波的功能开放&#xff0c;界面也是改了不少。点击左侧的 Explore 或者左下角的用户处&#xff0c;就可以直接进入新的 GPTs 功能&#xff1a; 这里可以看到我们…

Vue3挂载完毕后,隐藏dom再重新加载组件的方法

组件原本是在PC端使用的&#xff0c;现在需要把组件再封装一次&#xff0c;供app调用&#xff0c;但是在app上会显示tag栏&#xff0c;有占位影响空间&#xff0c;所以需求去掉头部tag&#xff0c;只显示下方组件。 实现方法&#xff0c;以前是直接引用的组件&#xff0c;现在改…

MySQL 前瞻

数据库 是一类软件&#xff0c;这一类软件可以用来“管理数据”&#xff08;对数据进行保存&#xff0c;增删改查 [与数据结构的有什么区别呢&#xff1f;]&#xff09; 数据结构是实现增删改查的具体方式 数据库则是管理数据的软件&#xff0c;实现数据库软件内部就用到了很…

2024重庆大学计算机考研分析

24计算机考研|上岸指南 重庆大学 重庆大学计算机考研招生学院是计算机学院和大数据与软件学院。目前均已出拟录取名单。 重庆大学计算机学院是我国高校最早开展计算机研究的基地之一&#xff0c;1978年和1986年获西南地区首个硕士和博士点&#xff0c;1998年成立计算机学院&a…

主机怎么通过命令行方式向虚拟机传输文件

这是几个月前遇到的问题了&#xff0c;那时候想着要记录下来&#xff0c;但后来忙忘了&#xff0c;这次想起来了&#xff0c;于是记录一下。 之前打靶场的时候需要将netcat-win32-1.12放入虚拟机的/var/www/html下&#xff0c;但是我虚拟机无法上网&#xff0c;也就是说无法直…