僵尸状态:Z
z:如果没有人检测或回收进程,改进程退出就进入Z
检测或回收由父进程进行操作
实验代码:
#include<iostream>
#include<unistd.h>
using namespace std;
int main()
{
pid_t id = fork();
if(id == 0)
{
//child
while(true)
{
cout<<"i am child, running!"<<endl;
sleep(2);
}
}
else{
//parent
cout << "father do nothing!" <<endl;
sleep(50);
}
return 0;
}
我们用代码来进行:
父进程什么都不做
子进程每隔两秒进行一次打印
我们在五十秒之内将子进程干掉
此时的父进程什么都不管,(他还要睡眠50秒)
此时的子进程就是:已经死了,但是没有被别人回收,就进入了僵尸状态
监控代码:
为了让我们能够更好的检测这些,需要一段检测代码
while :; do ps axj | head -1 && ps ajx | grep a.out | grep -v grep; sleep 1; echo “#################################”; done
不断的进行循环,执行这个命令,grep找这个命令,同时头部拿出来,每隔一秒检测一次,然后用"###"进行分割
实验开始:
我们创建三个窗口
第一个检测状态
第二个kill进程
第三个启动进程a.out
此时我们的子进程就进入了僵尸状态
并且这个子进程后面会有一个defunct
延伸:
想要停止最左边和最右边的两个窗口
ctrl+c 就可以了