linux多进程基础(2):僵尸进程以及解决方法wait()函数(大白话解释)

在我的linux多线程多进程基础专栏中,已和大家一起分享了僵尸线程.在这一篇文章中我将分享僵尸进程以及解决方法wait()函数.

1.僵尸进程

什么是僵尸进程呢?用最通俗易懂的话来说就是子进程执行结束的时候其父进程并没有及时回收该子进程导致成为僵尸进程.如果僵尸进程数量较多,会导致进程表等内核数据结构变得过大,从而影响整个系统的性能和稳定性.我用一段代码给大家演示一下僵尸进程是怎么产生的:

#include <sys/types.h>
#include <unistd.h>
#include<iostream>
int main(void){pid_t pid=fork();if(pid>0){while(1){std::cout<<"我是父进程"<<std::endl;sleep(2);}}else if(pid==0){std::cout<<"我是子进程,我的ID是:"<<getpid()<<",我的父进程ID是:"<<getppid()<<std::endl;}
}

可以看到这段代码,子进程就执行了一次,但父进程会一直执行,且不会主动回收子进程,这样就将导致僵尸进程.执行代码:

使用linux命令ps aux,查看当前所有进程:

可以看到被白色标记的那一行,出现僵尸进程Z+.

我们使用ctrl+z将程序结束运行,并用kill -s SIGCHLD pid(PS:这里的 pid 替换成父进程的进程 id)杀死僵尸进程.

那么,我们如何避免出现僵尸进程呢,我们需要提醒主进程,当子进程结束的时候,将子进程资源回收,这就是wait函数的功能.

2.wait()函数

wait函数用于回收子进程资源,其定义如下:

int wait(int *status);

其中,status 是一个指针,用于存储子进程的退出状态.

当一个子进程正常结束时,它的退出状态为 0。如果因异常情况而终止,那么它的退出状态将是非零值。注意:wait() 函数是阻塞的,意味着父进程会暂停执行,直到子进程结束。

回到刚刚那个产生僵尸进程的代码,引入wait()函数进行修改.代码如下:

#include <sys/types.h>
#include <unistd.h>
#include<iostream>
#include <sys/wait.h>int main(void){pid_t pid=fork();if(pid>0){while(1){std::cout<<"我是父进程"<<std::endl;wait(&pid);sleep(2);}}else if(pid==0){std::cout<<"我是子进程,我的ID是:"<<getpid()<<",我的父进程ID是:"<<getppid()<<std::endl;}
}

运行程序并查看系统中所有运行的进程,并未发现僵尸进程,说明wait函数成功指示主函数将子进程资源回收,大功告成!

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

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

相关文章

FLUKE 8588A数字多用表

181/2461/8938产品概述&#xff1a; 福禄克校准8588A参考万用表是世界上最稳定的数字化万用表。这款长量程高精度参考万用表专为校准实验室设计&#xff0c;具有出色的精度和长期稳定性&#xff0c;测量范围广泛&#xff0c;具有直观的用户界面和彩色显示屏。8588A具有超过12种…

Java重修第五天—面向对象2

通过学习本篇文章可以掌握如下知识 static&#xff1b;设计单例&#xff1b;继承。 之前文章我们已经对面向对象进行了入门学习&#xff0c;这篇文章我们就开始深入了解面向对象设计。 static 我们定义了一个 Student类&#xff0c;增加姓名属性&#xff1a;name &#xff1…

Manjora 中使用idm,linux通用

说明 在Mnajora中的idm需要在wine中运行&#xff0c;idm是一款很不错的下载工具&#xff0c;但是在linux不能直接使用&#xff0c;借助wine也无法使用浏览器的集成插件&#xff0c;在网上偶然发现一款第三方插件能够在linux的浏览器中将链接捕捉到idm中&#xff0c;虽然使用起…

未来已来:C++17 并行STL性能测评

C17 并行STL使用与测评 目录 各个编译器支持进度并行算法库要求如何使用性能测试 最近在研究一些并行框架&#xff0c;发现C17之后STL支持并行&#xff0c;于是使用并做了个性能测评&#xff0c;在测评过程中遇到一些问题&#xff0c;特别是TTB&#xff0c;本文将会带大家扫盲学…

python24.1.13for循环

对列表、字典、字符串等进行迭代 range

【AI大模型应用开发】1.1 Prompt Engineering(提示词工程)- 用OpenAI API实战,优化方法论总结

书接上文 【AI大模型应用开发】1.0 Prompt Engineering&#xff08;提示词工程&#xff09;- 典型构成、原则与技巧&#xff0c;代码中加入Prompt&#xff0c;我们开始实战。 文章目录 0. 从最简单的开始0.1 通用代码封装0.2 使用 - 从最简单的Prompt开始0.2.1 temperature参数…

红黑树(RBTree)

目录​​​​​​​ 一、红黑树简介 二、红黑树的来源 三、什么是红黑树 四、红黑树的性质 五、红黑树的节点定义 六、红黑树的操作 6.1、红黑树的查找 6.2、红黑树的插入 七、红黑树的验证 八、红黑树和AVL树的比较 一、红黑树简介 红黑树是一种自平衡的二叉查找树…

Webhook端口中的自定义签名身份认证

概述 如果需要通过 Webhook 端口从交易伙伴处接收数据&#xff0c;但该交易伙伴可能对于安全性有着较高的要求&#xff0c;而不仅仅是用于验证入站 Webhook 要求的基本身份验证用户名/密码&#xff0c;或者用户可能只想在入站 Webhook 消息上增加额外的安全层。 使用 Webhook…

DolphinScheduler伪集群部署

一.伪集群部署 伪集群部署目的是在单台机器部署 DolphinScheduler 服务&#xff0c;该模式下master、worker、api server、logger server都在同一台机器上。单机版本稳定性较差&#xff0c;官方建议20个以下流程使用。 二.前置需求 &#xff11;、&#xff12;.&#xff10;.…

智能小程序小部件(Widget)开发详解

Widget 代表应用的一个小部件&#xff0c;负责小部件的展示和交互。 小部件(Widget) 的开发在智能小程序的基础上增加一个目录即可&#xff0c;用于存放小部件(Widget)的代码。并在 project.tuya.json 中增加一个声明。 创建小部件(Widget)项目 在 Tuya MiniApp Tools 中&…

anaconda创建虚拟环境启动jupyter notebook

1.进入虚拟环境 &#xff08;以环境名为py37_pytorch1.9为例&#xff09; 创建虚拟环境: conda create -n py37_pytorch1.9 python3.7 查看已经创建的虚拟环境&#xff1a; ​​​​​​​conda env list 切换/进入环境&#xff1a; conda activate py37_pytorch1.9 删除环…

【数据集处理】FFHQ如何进行人脸对齐,Aligned and cropped images at 1024×1024

什么是人脸对齐&#xff1f; 人脸对齐是一种图像处理技术&#xff0c;旨在将图像中的人脸部分对齐到一个标准位置或形状。在许多情况下&#xff0c;这通常涉及将眼睛、鼻子和嘴巴等关键点对齐到特定的位置。通过这种方式&#xff0c;所有的人脸图像可以有一个一致的方向和尺寸…