【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;可直接运行。

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

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

分布式单元化

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

力扣 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;逐渐受到人们的关注。本文将对零信任网络的概念…

回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测

回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测 目录 回归预测 | Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现MPA-BP海洋捕食者算法优化BP神经网络多变量回归预测&…

同步网盘与云盘:哪个更好用?

同步网盘、同步云盘现在是热门的文件管理工具&#xff0c;在回答“同步网盘云盘哪个好用”这个问题之前&#xff0c;我们需要知道什么样的同步网盘、同步云盘算好用&#xff1f; 什么样的同步网盘云盘好用&#xff1f; 1、存储空间大 对于文件管理工具而言&#xff0c;存储空…

PCTA认证考试-01_TiDB数据库架构概述

TiDB 数据库架构概述 一、学习目标 理解 TiDB 数据库整体结构。了解 TiDB Server&#xff0c;TiKV&#xff0c;TiFlash 和 PD 的主要功能。 二、TiDB 体系架构 1. TiDB Server 2. TiKV OLTP 3. Placement Driver 4. TiFlash OLAP OLTPOLAPHTAP

思考的起点(一): 事实与判断

事实与判断是思考的主要组成部分&#xff0c;深入理解事实与判断的基本概念&#xff0c;了解其应用可以提升个体的思考质量; 关于事实真相 事实是认知的基础 1.很多事情没有真相, 或者说真相陷入历史的迷雾中, 无法被发现; 2.世界不需要真相&#xff0c;真相往往都是复杂又残…

GZ035 5G组网与运维赛题第9套

2023年全国职业院校技能大赛 GZ035 5G组网与运维赛项&#xff08;高职组&#xff09; 赛题第9套 一、竞赛须知 1.竞赛内容分布 竞赛模块1--5G公共网络规划部署与开通&#xff08;35分&#xff09; 子任务1&#xff1a;5G公共网络部署与调试&#xff08;15分&#xff09; 子…

【实践篇】一次Paas化热部署实践分享 | 京东云技术团队

前言 本文是早些年&#xff0c;Paas化刚刚提出不久时&#xff0c;基于部门内第一次Paas化热部署落地经验所写&#xff0c;主要内容是如何构建一些热部署代码以及一些避雷经验。 一、设计-领域模型设计 1.首先&#xff0c;确定领域服务所属的领域 2.其次&#xff0c;确定垂直…

图解系列--理解L3交换机的性能与功能

04.01 何为 L3 交换机 L3交换机是一种在L2 交换机的基础上增加了路由选择功能的网络硬件&#xff0c;能够通过基于ASIC 和 FPGA 的硬件处理高速实现网络功能和转发分组。L2 是指 OSI 参考模型中的L2, 也就是数据链路层。L2 交换机能够基于该层主要编址的 MAC 地址&#xff0c;…

深度学习框架TensorFlow.NET环境搭建1(C#)

测试环境 visual studio 2017 window10 64位 测试步骤如下&#xff1a; 1 新建.net framework控制台项目&#xff0c;工程名称为TensorFlowNetDemo&#xff0c;.net framework的版本选4.7.2&#xff0c;如下图&#xff1a; 2 分别安装TensorFlow.NET包(先装)和SciSharp.…

力扣每日一题100:相同的树

题目描述&#xff1a; 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a;p [1,2,3], q [1,2,3] 输出&…