僵死进程(僵尸进程)

1.僵死进程产生的原因或者条件:

什么是僵死进程?
当子进程先于父进程结束,父进程没有获取子进程的退出码,此时子进程变成僵死进程.

简而言之,就是子进程先结束,并且父进程没有获取它的退出码;

那么僵死进程产生的原因或者条件就是:子进程先于父进程结束,并且父进程没有获取子进程的退出码;

2.进程结束的过程以及僵死进程产生的过程:

3.观察僵死进程:

父进程执行7次,子进程改为3次;就能观察到僵死进程(放到后台运行&,ps -f);

4.处理僵死进程

(1)父进程先结束(子进程会变成孤儿进程,孤儿进程会被收养(红帽子是init(pid==1)收养孤儿进程,Unbuntu是操作系统指定了一个进程));

(2)父进程调用wait()方法获取子进程的退出码;

本质:都是调用了wait方法;

代码演示:

方法一:父进程先结束//就是把父进程的n=3,子进程的n=7即可;

方法二:显示的调用wait:

cpp 复制代码
else
{
    s="parent";
    n=7;
    int val=0;
    wait(&val);
    printf("val=%d\n",val);
}

但是两种方法都有区别:就是父进程调用wait会阻塞,等子进程执行完之后,父进程才会去执行;

5.处理僵死进程的意义;

僵死进程的坏处:白白消耗内存;(讲服务器代码的时候会演示)

6.退出码

改代码:exit(3);

执行显示val=768;

man 2 wait

WIFEXITED:正常退出的状态;

WEXITSTATUS:获取退出码;

cpp 复制代码
    else//父进程
    {   
        s="parent";
        n=7;
        int val=0;
        wait(&val);
        if(WIFEXITED(val))
        {
         printf("val=%d\n",WEXITSTATUS(val));
        }
    }

7.避免僵死进程的方法总结

1)父进程先结束;
2)父进程调用wait()方法获取子进程的退出码; 其实两种处理僵死进程的方法本质都是一样的,都调用了wait获取子进程退出码(方法一是父进程先结束后子进程被Init(现在随着内核的发展不一定是1)收养,Init之后调用wait获取子进程退出码;方法二是父进程直接调用wait,)但是两种方法又有区别,就是父进程调用wait会阻塞,等子进程执行完之后,父进程才会执行.
若想父进程调用wait不阻塞,那么我们需要结合信号一起.具体在信号那一节用代码演示;

相关推荐
老秦包你会2 分钟前
Linux课程五课---Linux进程认识1
linux·运维·服务器
等猪的风16 分钟前
openwrt作旁路由时的几个常见问题 openwrt作为旁路由配置zerotier 图文讲解
运维·服务器·网络
互联网搬砖老肖20 分钟前
运维打铁:域名详解及常见问题解决
运维·github
浩浩测试一下20 分钟前
网络安全实战指南:从安全巡检到权限维持的应急响应与木马查杀全(命令查收表)
linux·安全·web安全·ubuntu·网络安全·负载均衡·安全架构
千码君201633 分钟前
什么是数据链路层的CRC检测以及为什么要放到帧尾?
服务器·网络·网络协议·以太网·奇偶校验·crc检测·以太网帧
Qiuner39 分钟前
软件设计师速通其一:计算机内部数据表示
服务器·数据库·信号处理
我想吃余43 分钟前
Linux学习笔记(一):Linux下的基本指令
linux·笔记·学习
LaughingZhu1 小时前
PH热榜 | 2025-04-24
运维·经验分享·搜索引擎·产品运营·jenkins
刘某的Cloud1 小时前
openstack迁移虚机rbd报错,删除异常rbd
linux·运维·openstack·nova·rbd
啊吧怪不啊吧1 小时前
Linux权限概念讲解
linux·运维·服务器