星球的眼睛 发表于 2025-3-24 05:01:45

进程概念之僵尸进程

(zombie)-僵尸进程

1.僵尸状态(zombie)是⼀个比较特殊的状态。当进程退出而且父进程没有读取到子进程退出的返回代码时就会产生僵尸进程
2.僵尸进程会以终止状态生存在进程表中,而且会不绝在等候父进程读取退出状态代码。因此,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z(僵尸状态)
接下来创建一个维持30秒的僵尸进程的例子:
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>

int main()
{
        //先使用fork函数创建一个子进程
        pid_t id = fork();
        //如果id值小于0,说明创建失败
        if(id<0)
        {
                //弹出错误信息,并且退出
                perror("fork");
                exit(1);
        }
        //如果退出码>0,说明是父进程
        else if(id > 0)
        {
                //父进程写一个死循环用来观察子进程的状态
                while(1)
                {
                        printf("我是一个父进程,我的pid是=%d\n",gitpid());
                        //每过一秒打印一次
                        sleep(1);
                }
        }
        else //这个是子进程
        {
                //子进程让他打印五次,用来观察将是状态的结果
                int cnt = 5;
                while(cnt--)
                {
                        printf("我是一个子进程,我的pid=%d",getpid());
                        //同样每过一秒打印一次
                        sleep(1);
                }
               
        }
        return 0;
}
代码写完后输入下令gcc -o myprocess myprocess.c进行编译
https://i-blog.csdnimg.cn/direct/0caa8a05382c46328eef7a63798bd903.png
编译乐成后这里我们打开另一个终端,开始检测,使用一个shell脚本用来观察我们的进程状态
while :; do ps ajx |head -1; ps ajx | grep myprocess; sleep 1;done
这段代码就可以让我们的机器重复观察myprocess这个步调的状态
https://i-blog.csdnimg.cn/direct/dc633e3b801b4c75bf044851270f2027.png
刚开始的时间我们这里只有系统主动启动的bash进程,这个时间我们运行自己写的myprocess步调在进行观察
https://i-blog.csdnimg.cn/direct/e5034fce55ad49e8bcc4ee3079df9b80.png
可以观察到当我们的子进程制止执行后,我们的步调中也就出现了僵尸进程,具体哪个进程是子进程,我们可以通过观察pid进行区分,最终我的得到的结论就是,当我们的父进程没有回收子进程时,子进程将会变成将是状态,等候父进程的回收。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 进程概念之僵尸进程