【Linux】僵尸进程、孤儿进程的理解与验证

僵尸进程

概念

僵尸进程(Zombie Process)是指一个已经终止执行的子进程,但其父进程尚未调用 wait()waitpid() 函数来获取子进程的退出状态。

  • Linux 中,僵尸进程会保留一些资源,如进程 ID、进程表项和一些系统资源,但不再执行任何代码

  • 僵尸进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码

创建僵尸进程,并检测

下面的代码将创建僵尸进程,并可以通过指令来查询其'Z' 状态:

  • 在代码中,当父进程创建子进程后,父进程会通过 sleep(10) 函数暂停 10 秒钟等待子进程结束。在这个等待期间,子进程会立即退出并成为一个僵尸进程
int main()
{pid_t pid = fork();if(pid < 0){std::cerr << "fork error" << std::endl; // 创建失败exit(1);}else if(pid == 0) // 子进程{// 获取并打印 子进程的pid std::cout << "子进程:" << getpid() << "正在运行" << std::endl;exit(0);}else // 父进程{std::cout << "父进程:" << getpid() << "等待子进程结束" << std::endl;sleep(10); // 父进程暂停10s,等待子进程结束std::cout << "父进程:" << getpid() << "结束" << std::endl;}return 0;
}

当成功运行程序后,我们通过下面的指令检测僵尸进程:

# 列出所有处于僵尸状态的进程的相关信息,包括进程号、父进程号、状态和命令行
ps -A -o pid,ppid,state,command | grep 'Z'

执行结果

请添加图片描述

危害

僵尸进程本身并不会对系统造成直接的危害,因为它们不再执行任何代码。然而,如果系统中存在大量的僵尸进程,可能会导致以下问题:

  • 资源浪费僵尸进程会占用一些系统资源,如进程 ID、进程表项和一些系统内存。 虽然这些资源通常很小,但如果大量的僵尸进程积累,可能会导致资源浪费,降低系统的性能。

  • 进程数量限制:操作系统对进程数量有一定的限制,具体取决于系统的配置和资源。如果系统中存在大量的僵尸进程,可能会消耗进程 ID 的数量限制,导致无法创建新的进程。

  • 资源浪费:虽然僵尸进程本身不会直接影响系统稳定性,但如果父进程没有正确处理子进程的退出状态,可能会导致父进程无法正常工作或异常终止,从而影响系统的稳定性。

  • 安全风险:如果恶意程序利用僵尸进程的存在来进行攻击,可能会导致安全风险。例如,恶意程序可以通过创建大量的僵尸进程来耗尽系统资源,或者利用僵尸进程来隐藏自己的存在。

为了避免僵尸进程的危害,父进程应该正确处理子进程的退出状态。这可以通过调用 wait()waitpid()函数来实现。当父进程调用这些函数时,它会等待子进程的退出,并获取其退出状态。通过及时处理子进程的退出状态,可以释放僵尸进程所占用的资源,保持系统的稳定性和性能。


孤儿进程

概念

孤儿进程(Orphan Process)是指父进程先于子进程结束,导致子进程的父进程变为系统进程(PID=1,称为一号进程)(通常是 init 进程或 systemd 进程),从而成为孤儿进程。

创建孤儿进程,并检测

下面的代码创建了孤儿进程,并可以通过指令来获取其信息:

int main()
{pid_t pid = fork();if (pid == -1){// 创建子进程失败std::cerr << "failed to fork" << std::endl;return 1;}else if (pid == 0) // 子进程{// 子进程任务内容sleep(2); // 进程等待时间std::cout << "Child process: My PID is " << getpid() << std::endl;std::cout << "Child process: My parent's PID is " << getppid() << std::endl;while (1){// 打印子进程进程号信息。printf("The child  process is running ! childpid=%d fatherpid=%d \n", getpid(), getppid());sleep(2);}}else // 父进程{std::cout << "Parent process: My PID is " << getpid() << std::endl;return 0; // 父进程立即退出,子进程变孤儿进程}return 0;
}

当我们成功运行程序后,执行命令检测孤儿进程

请添加图片描述

危害

  1. 占用系统资源:孤儿进程虽然没有父进程,但仍然在系统中运行并占用系统资源,如内存、CPU 时间等,会影响系统的性能和稳定性。

  2. 导致资源泄露:孤儿进程如果没有被及时回收,可能会导致资源泄露,如文件描述符、网络连接等,这些资源无法被其他进程使用,浪费了系统资源。

  3. 降低系统安全性:孤儿进程可能会成为黑客攻击的入口,黑客可以利用孤儿进程来执行恶意代码,窃取敏感信息或者破坏系统安全。

  4. 影响系统稳定性:孤儿进程如果不及时回收,可能会导致系统崩溃或死锁等问题,从而影响系统的稳定性。

及时处理孤儿进程是维护系统稳定性和安全性的重要措施之一。一般来说,可以通过编写程序来检测和处理孤儿进程,或者通过设置信号处理函数等方式来避免孤儿进程的产生。

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

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

相关文章

王道p18 07.将两个有序顺序表合并为一个新的有序顺序表,并由函数返回结果顺序表。(c语言代码实现)

视频讲解在这&#xff1a;&#x1f447; p18 第7题 c语言代码实现王道数据结构课后代码题_哔哩哔哩_bilibili 本题代码如下 int merge(struct sqlist* A, struct sqlist* B, struct sqlist* C) {if (A->length B->length > C->length)//大于顺序表的最大长度r…

48基于matlab的经验傅里叶分解,适用于非线性及非平稳时间序列分析,将信号进行精确分解。程序已调通,可直接运行。

基于matlab的经验傅里叶分解&#xff0c;适用于非线性及非平稳时间序列分析&#xff0c;将信号进行精确分解。程序已调通&#xff0c;可直接运行。

图学习笔记

1、邻接矩阵&#xff08;vector二维数组&#xff09;的DFS&#xff08;递归实现&#xff09; class Graph { public:Graph(int vertices);void addEdge(int from, int to);void DFS(int startVertex);private:int vertices;vector<vector<int>> adjMatrix;vector&…

java中的Thread类解析

实现线程的三种方式 1、继承Thread类&#xff0c;重写里面的run方法 public class MyThread extends Thread{Overridepublic void run() {System.out.println("threadName:"Thread.currentThread().getName());}}/*** 方式一&#xff1a;继承Thread类&#xff0c;重…

玻色量子签约移动云“五岳”量子云计算创新加速计划!

2023年4月24-26日&#xff0c;由中国移动通信集团主办的“云擎未来 智信天下”2023移动云大会在苏州圆满落幕。 中国移动在本次大会发布了“五岳”量子云计算创新加速计划。作为中国移动量子计算方向的战略伙伴&#xff0c;玻色量子创始人&CEO文凯博士代表北京玻色量子科技…

分布式单元化

一 分布式单元化 1.1 两地三中心 顾名思义&#xff0c;两地指的是两个城市&#xff1a;同城&#xff0c;异地。三中心指的是三个数据中心&#xff1a;生产中心、同城容灾中心、异地容灾中心。 在同一个城市或者临近的城市建设两个相同的系统&#xff0c;双中心具备相当的业…

【c++随笔11】面向对象和封装

【c随笔11】面向对象和封装 一、什么是面向对象编程&#xff1f;1、面向对象以对象作为程序的基本单元2、类和对象3、特性继承和多态性 二、什么是封装&#xff1f;1、类的定义和访问修饰符2、封装数据和公共接口3、数据验证和处理4、封装的优点5、实际应用示例 三、再次理解1、…

1,Opencv常用结构

1&#xff0c;Point类&#xff1a;点表示 point表示二维结构的点,(x,y) cv::Point point; point.x 100; point.y 100;2&#xff0c;Scalar类&#xff1a;颜色表示 cv::Scalar colorBlue(255,0,0);//蓝色 cv::Scalar colorGreen(0, 255, 0);//绿色 cv::Scalar colorRed(0, …

银行存取款系统

题目 ​ 一个简单的存取款系统,用户可以选择存钱、取钱、转账、修改密码和退出系统等业务。程序使用了菜单界面来展示业务选项,并根据用户的选择调用相应的函数进行处理。具体功能如下: 登录:实现登录功能,需要输入正确密码才能进入菜单系统。 菜单:显示菜单界面,列出其…

Go基础(待更新)

Go基础&#xff08;待更新&#xff09; 参考Go 语言教程 文章目录 Go基础&#xff08;待更新&#xff09;一、基本语法1、格式化输出2、声明并赋值1&#xff09;单变量赋值2&#xff09;多变量赋值 二、math工具包的使用三、函数1、参数传递1&#xff09;普通传递2&#xff09…

proxy 属性与方法

proxy 属性与方法实例 proxy 属性与方法 proxy 是 JavaScript 中的一个内置对象&#xff0c;它提供了一种机制来拦截并自定义对象的基本操作。 通过使用 proxy&#xff0c;我们可以在对象上定义自定义行为&#xff0c;例如拦截属性访问、函数调用、构造函数调用等。 proxy 对…

C++ 统计一个字符串当每个字符出现的权重。

abbccc$b b:2 本题目为第一步&#xff0c;读入待编码字符串&#xff0c;建造一个森林&#xff0c;请补全下列代码。 #include <stdio.h> #include <stdlib.h> #include <malloc.h> typedef char elemtype; //带权值的二叉树 typedef struct BiTNode{ elemtyp…

使用 rosdep 管理 ROS 2 依赖项

系列文章目录 文章目录 系列文章目录前言 清华源镜像使用一、什么是 rosdep&#xff1f;二、关于 package.xml 文件的一些小知识三、rosdep 是如何工作的&#xff1f;四、如何知道在 package.xml 中输入哪些 key &#xff1f;五、如何使用 rosdep 工具&#xff1f;5.1 rosdep 安…

力扣 141.环形链表和142.环形链表2

目录 1.环形链表Ⅰ解题思路2.环形链表Ⅰ代码实现3.环形链表Ⅱ解题思路4.环形链表Ⅱ代码实现 1.环形链表Ⅰ解题思路 利用快慢指针&#xff0c;快指针一次走两个&#xff0c;慢指针一次走一个&#xff0c;如果出现了快指针为空或者快指针的next为空的现象则说明不带环&#xff0…

Docker dnmp 多版本php安装 php8.2

Laravel9 开发需要用到php8.1以上的版本&#xff0c;而dnmp只支持到php8.0。安装php8.2的步骤如下&#xff1a; 1. 从/services/php80目录复制一份出来&#xff0c;重命名为php82&#xff0c;extensions目录只保留 install.sh 和 install-php-extensions 这两个文件 2. 修改.en…

4 Tensorflow图像识别模型——数据预处理

上一篇&#xff1a;3 tensorflow构建模型详解-CSDN博客 本篇开始介绍识别猫狗图片的模型&#xff0c;内容较多&#xff0c;会分为多个章节介绍。模型构建还是和之前一样的流程&#xff1a; 数据集准备数据预处理创建模型设置损失函数和优化器训练模型 本篇先介绍数据集准备&am…

网络安全应急响应工具(系统痕迹采集)-FireKylin

文章目录 网络安全应急响应工具(系统痕迹采集)-FireKylin1.FireKylin介绍【v1.4.0】 2021-12-20【v1.0.1】 2021-08-09 2.客户端界面Agent支持的操作系统FireKylinAgent界面使用方式比较传统方式与FireKylin比较无法可达目标的场景应用对比 3.使用教程设置语言Agent配置&#x…

c++11中的线程库和包装器

c11 1. 线程库1.1 线程库1.2 锁mutex 2. 包装器2.1 funciton2.2 bind 1. 线程库 1.1 线程库 C11中的线程库提供了一种方便的方式来创建和管理线程。其中&#xff0c;std::thread是一个重要的类&#xff0c;它允许我们创建新线程并控制它们的执行。以下是std::thread的一些重要…

1822_使用python内置的库进行日期序列的生成

使用python的内置的库进行日期序列的生成 用到的库介绍 datetime 实现这样的功能其实只需要这一个库就够了&#xff0c;但是网络上找到的例程很多都额外增加了对time库的引用。只能说&#xff0c;这样不会出现错误&#xff0c;但是这样肯定会有一些计算资源上的消耗。 #!/u…

零信任网络:一种全新的网络安全架构

随着网络技术的不断发展&#xff0c;网络安全问题日益凸显。传统的网络安全策略往往基于信任和验证&#xff0c;但这种信任策略存在一定的局限性。为了解决这一问题&#xff0c;零信任网络作为一种全新的网络安全架构&#xff0c;逐渐受到人们的关注。本文将对零信任网络的概念…