【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. 影响系统稳定性:孤儿进程如果不及时回收,可能会导致系统崩溃或死锁等问题,从而影响系统的稳定性。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设数据为01101001,试采用4个校验位求其偶校验方式的海明码。

遇到一个题目&#xff0c;但是教材书上写的比较迷糊&#xff0c;看不懂&#xff0c;后来在网上搜了一下方法&#xff0c;发现还是比较简单的&#xff0c;现在分享一下我的解法 首先&#xff0c;套用公式&#xff1a;2k - 1 > n k 因为求得数字是8位数&#xff0c;n8&#x…

vue+vant图片压缩后上传

vuevant图片压缩后上传 vue文件写入 <template><div class"home"><van-field input-align"left"><template #input><van-uploaderv-model"fileList.file":after-read"afterRead":max-count"5":…

【计算机网络笔记】传输层——TCP的可靠数据传输

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…

【npm run dev 报错:error:0308010C:digital envelope routines::unsupported】

问题原因&#xff1a; nodejs版本太高&#xff08;nodejs v17版本发布了openSSL3.0对短发和密钥大小增加了更为严格的限制&#xff0c;nodejs v17之前版本没有影响&#xff0c;但之后的版本会出现这个错误&#xff0c;物品的node版本是20.9.0&#xff09; 解决方式&#xff1…

搜维尔科技:网球运动员使用Xsens寻求精确的动作捕捉

就像其他一些运动一样,近年来网球迷们没有机会去参加许多真正优秀的模拟游戏,所以当一个人出现并承诺有这种体验时,很难不激动。开发者圆环游戏 匹配点:网球锦标赛 现在,我们承诺在单一支付者和多人组成部分的球场上有一个坚实的经验,我们对游戏和游戏的内部和外部都很好奇,我…

XSpirit 2智能边缘计算机使用测评

博客主页&#xff1a;https://tomcat.blog.csdn.net 博主昵称&#xff1a;农民工老王 主要领域&#xff1a;Java、Linux、K8S 期待大家的关注&#x1f496;点赞&#x1f44d;收藏⭐留言&#x1f4ac; 目录 拆箱过程介绍视频使用感受 我之前就参加过 Spirit 1 第一代智能边缘计…

Nginx搭载负载均衡及前端项目部署

目录 ​编辑 一.Nginx安装 1.安装所需依赖 2.下载并解压Nginx安装包 3.安装nginx 4.启动Nginx服务 二.Tomcat负载均衡 1.准备环境 1.1 准备两个Tomcat 1.2 修改端口号 1.3 配置Nginx服务器集群 2.效果展示 ​编辑三.前端项目打包 ​编辑四.前端项目部署 1.上传项目…

Maven修改仓库和镜像地址

目录 1、修改仓库地址2、修改镜像地址 1、修改仓库地址 使用IDEA时,如果不指定自己下载的Maven,idea会默认使用自带的Maven 3&#xff08;bundle)。maven 3默认的仓库路径一般是在c盘的用户文件夹中的.m2目录下&#xff1a; 当maven下的pom文件中的依赖逐渐增加时,maven仓库下…

进程控制(二):进程等待

文章目录 进程控制&#xff08;二&#xff09;进程等待wait函数waitpid函数wait/waitpid获取子进程状态码的过程进程等待相关的宏 总结 进程控制&#xff08;二&#xff09; 延续对于上文进程结束&#xff0c;我们继续对于进程控制进行学习&#xff0c;本文我们主要是对于进程…

详解IPD需求分析工具$APPEALS

够让企业生存下去的是客户&#xff0c;所以&#xff0c;众多企业提出要“以客户为中心”&#xff0c;那如何做到以客户为中心&#xff1f;IPD中给出的答案是需求管理。 需求管理流程&#xff0c;是IPD&#xff08;集成管理开发&#xff09;体系中的四大支撑流程之一&#xff0…

【STM32】基于HAL库建立自己的低功耗模式配置库(STM32L4系列低功耗所有配置汇总)

【STM32】基于HAL库建立自己的低功耗模式配置库&#xff08;STM32L4系列低功耗所有配置汇总&#xff09; 文章目录 低功耗模式&#xff08;此章节可直接跳过&#xff09;低功耗模式简介睡眠模式停止模式待机模式 建立自己的低功耗模式配置库通过结构体的方式来进行传参RTC配置…

python如何使用gspread读取google在线excel数据?

一、背景 公司使用google在线excel管理测试用例&#xff0c;为了方便把手工测试用到的测试数据用来做自动化用例测试数据&#xff0c;所以就想使用python读取在线excel数据&#xff0c;通过数据驱动方式&#xff0c;完成自动化回归测试&#xff0c;提升手动复制&#xff0c;粘…

【深度学习基础】专业术语汇总(欠拟合和过拟合、泛化能力与迁移学习、调参和超参数、训练集、测试集和验证集)

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

以太网【FPGA】

1物理&#xff1a; 2接线&#xff1a; 信号名 信号类型 对应引脚 备注 sys_clk Input B5 系统晶振输入时钟&#xff0c;频率 50MHz sys_rst_n Input E8 系统复位信号&#xff0c;低有效 eth_rxc Input E17 PHY 输入时钟&#xff0c;频率 125MHz eth_rx_ctl Inpu…

合肥中科深谷嵌入式项目实战——人工智能与机械臂(五)

订阅&#xff1a;新手可以订阅我的其他专栏。免费阶段订阅量1000 python项目实战 Python编程基础教程系列&#xff08;零基础小白搬砖逆袭) 作者&#xff1a;爱吃饼干的小白鼠。Python领域优质创作者&#xff0c;2022年度博客新星top100入围&#xff0c;荣获多家平台专家称号。…

Redis ----使用Java代码操作redis(2)

⭐⭐ Redis专栏&#xff1a;Redis专栏 ⭐⭐ 个人主页&#xff1a;个人主页 目录 一.Java连接redis 二.Java操作redis常见数据类型存储 2.1 String类型的操作 2.2 hash 2.3 集合 list 三.redis的运用场景 一.Java连接redis 第一步&#xff1a;导入依赖…

第十五章 EM期望极大算法及其推广

文章目录 导读符号说明混合模型伯努利混合模型(三硬币模型)问题描述三硬币模型的EM算法1.初值2.E步3.M步初值影响p,q 含义 EM算法另外视角Q 函数BMM的EM算法目标函数LEM算法导出 高斯混合模型GMM的EM算法1. 明确隐变量, 初值2. E步,确定Q函数3. M步4. 停止条件 如何应用GMM在聚…

ConnectionError: HTTPSConnectionPool

ConnectionError: HTTPSConnectionPool(host‘zbbfxstatic.figtingdream.com’, port443): Max retries exceeded with url: /api/cache (Caused by NewConnectionError(‘<urllib3.connection.HTTPSConnection object at 0x00000249795AD9A0>: Failed to establish a ne…

iOS实现弹簧放大动画

效果图 实现代码 - (void)setUpContraints {CGFloat topImageCentery (SCREEN_HEIGHT - 370 * PLUS_SCALE) / 2;[self.topIconView mas_makeConstraints:^(MASConstraintMaker *make) {make.centerX.mas_equalTo(0);make.centerY.equalTo(self.view.mas_top).with.offset(t…

Halcon计算点到直线的垂线方程

一、我们都知道&#xff0c;点到直线最短距离就是垂线。Halcon也有现成的算子可以计算点到直线的距离 distance_pl( : : Row, Column, Row1, Column1, Row2, Column2 : Distance)。但是此算子不会返回具体的垂点坐标。当我们希望显示垂线的时候是需要知道垂点坐标&#xff0c;才…