【Linux】进程等待

server/2024/9/24 11:02:53/

思维导图

学习目标

一、进程等待的必要性

1.1 进程等待是什么?

       任何子进程,在退出的情况下,一般都必须让父进程进行等到,进程在退出的时候,如果父进程不管不顾,自己退出进程,那么子进程会进入僵尸状态Z,会造成内存泄漏

什么是僵尸进程呢??

       代码已经释放,数据也进行了释放,留下了PCB。PCB中会记录这个进程瑞退出时的退出信息。这种状态一直维持,PCB结构体所占的内存时非常大的,所以必然会导致内粗泄露。

1.2 为什么要有进程等待?

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

1.3 进程等待的必要性

  • 子进程退出,父进程如果不管不顾,就可能会导致僵尸进程问题,进而产生内存泄漏
  • 进程一旦变为僵尸状态,基本刀枪不入,kill - 9命令也会无动于衷,因为没有什么方法时可以将一个死去的进程给退出
  • 父进程派给子进程的任务完成的如何,我们需要知道,例如:子进程运行完成,结果是对还是不对。或者子进程有没有正常的退出。
  • 父进程通过进程等待的方式,回收子进程资源,获取子进程退出信息。

二、进程等待的方法

2.1 获取子进程的status

  • 因为在wait函数waitpid函数中的参数都有status的参数,该参数是一个输出性参数,由操作系统来填充
  • 如果传递NULL,则不关心子进程的退出状态信息
  • 操作系统可以根据这个status的值,来将子进程的退出信息反馈给父进程
  • status不能简单地当作整数来进行学习,status当作位图来进行表示错误码和错误信息的值是多少。因为只研究低16位,具体细节如下所示:

2.1.1 详细介绍一下位图status中各个位上的信息: 

位图是什么??

       位图(bitset)是一种常见的数据结构,常用在给一个很大范围的数(比如我之前看到一个题是有四十亿个数),判断其中的数是不是在其中。这里就要用到位图,显然这么多得数在内存中是存不下的,我们就得重新想办法。位图在索引、数据压缩有很大的应用。位图使用数组实现的,数组的每一个元素的每一个二进制位都表示一个数据,0表示该数不存在,1表示该数据存在

status各个位上的信息:

       status有32位,但是在这里只用到了16位,从0~6这7位表示的是退出信号的大小,从8~15位这8位表示的是退出码的大小。

2.1.2 通过status计算出错误码和错误信号 

int errorcode = status & 0x7f; // 错误信号的计算
int errorsignal = (status >> 8) & 0xff; // 错误码的计算

为了防止使用者将7和8弄混淆,又有专门的宏来表示退出码和推出信号。

  • WIFEXITED(status):用于查看进程是否是正常退出,本质是检查是否收到信号。
  • WEXITSTATUS(status):用于获取进程的退出码。

当一个进程的退出信号出现时,我们不需要关心退出码。

2.2 wait函数

2.2.1 wait函数的用途

       wait函数的用途是等待任何一个子进程的结束。

2.2.2 wait函数的介绍

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

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

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

2.2.3 使用代码进行观测

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>int main()
{printf("I am process, pid: %d, ppid: %d\n", getpid(), getppid());pid_t id = fork();if(id == 0){int cnt = 5;while (cnt--){sleep(1);printf("I am child, pid: %d, ppid: %d\n", getpid(), getppid());}exit(0);}printf("I am father, pid: %d, ppid: %d\n", getpid(), getppid());pid_t flag = wait(NULL);if(flag > 0){printf("正常退出!\n");}sleep(10);return 0;
}

我们可以使用以下监控脚本对进程进行实时监控:

while :; do ps ajx | head -1 && ps ajx | grep a.out | grep -v grep; sleep 1; done

       当我们进行运行代码后,我们子进程退出后,父进程会立刻进行回收;之后,让父进程睡眠10秒,那么在监控脚本下,最后就只有父进程。

2.3 waitpid函数

2.3.1 waitpid函数的用途

       waitpid函数的用途是等待父进程的任意一个子进程退出或者等待一个特定的子进程退出。

2.3.2 waitpid函数的介绍

#include <sys/types.h>
#include <sys/wait.h>pid_t waitpid(pid_t pid, int* status, int options);
2.3.2.1 返回值
  • 等待成功返回被等待进程的pid。

  • 如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0。

  • 如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在。

2.3.2.2 参数
  • pid:待等待子进程的pid,若设置为-1,则等待任意子进程。
  • status:输出型参数,获取子进程的退出状态,不关心可设置为NULL。
  • options:当设置为WNOHANG时,若等待的子进程没有结束,则waitpid函数直接返回0,不予以等待。若正常结束,则返回该子进程的pid。

四、父进程的阻塞等待和非阻塞等待

       阻塞等待就是父进程等待子进程运行完了,父进程再运行,非阻塞等待就是父子进程同时运行。


http://www.ppmy.cn/server/32097.html

相关文章

使用RTSP将笔记本摄像头的视频流推到开发板

一、在Windows端安装ffmpeg 1. 下载ffmpeg:下载ffmpeg 解压ffmpeg-master-latest-win64-gpl.zip bin 目录下是 dll 动态库 , 以及 可执行文件 ;将 3 33 个可执行文件拷贝到 " C:\Windows " 目录下 ,将所有的 " .dll " 动态库拷贝到 " C:\Windows\Sy…

001 springCloudAlibaba 负载均衡

文章目录 orderServerOrderController.javaProductClient.javaOrderServerApplication.javaServletInitializer.javaapplication.yamlpom.xml productServerProductController.javaProduct.javaProductServerApplication.javaServletInitializer.javaapplication.yamlpom.xml p…

Vue 项目 尚品汇(一)

一、开发环境构造 Vue-cli 脚手架初始化项目 node 平台 和 webpack 和 淘宝镜像 环境 &#xff08;一&#xff09;脚手架 1.安装脚手架 在我们的项目文件夹中路径输入 cmd 然后在终端中输入 vue create app(项目名) 选择 vue 2 然后安装 &#xff08;因为是基于 vue2 开…

3D看车有哪些强大的功能?适合哪些企业使用?

3D看车是一种创新的汽车展示方式&#xff0c;它提供了许多强大的功能&#xff0c;特别适合汽车行业的企业使用。 3D看车可实现哪些功能&#xff1f; 1、细节展示&#xff1a; 51建模网提供全套汽车行业3D数字化解决方案&#xff0c;3D看车能够将汽车展示得更加栩栩如生&…

Android 11 12 13耳机图标不显示问题解决方案以及整个图标显示流程

目录 1.解决方案 2.原理分析 ①.config.xml配置文件 ②.StatusBarIconControllerImpl ③.StatusBarIconView类

Docker私有镜像仓库搭建 带图形化界面的

搭建镜像仓库可以基于Docker官方提供的DockerRegistry来实现。 官网地址&#xff1a;https://hub.docker.com/_/registry 先配置私服的信任地址: # 打开要修改的文件 vi /etc/docker/daemon.json # 添加内容&#xff1a; "insecure-registries":["http://192.…

论文笔记(四十五)Attention Is All You Need

Attention Is All You Need 文章概括摘要1. 介绍2. 背景3. 模型架构3.1 编码器和解码器堆栈3.2 Attention3.2.1 按比例点积Attention3.2.2 Multi-Head Attention3.2.3 注意力在模型中的应用 3.3 定位前馈网络3.4 嵌入与 Softmax3.5 位置编码 4 为什么 Self-Attention5. Trainin…

如何编写测试用例

总结 测试用例需求来源 文档 用户角度 编写测试用例步骤 分析需求 写测试点 对需求的拆分 辅助完成测试用例的编写 编写测试用例 编写测试用例原则 能看懂 能执行 测试结果状…