linux:模拟僵尸进程和孤儿进程
1.僵尸进程
- 僵死状态(Zombies)是一个比较特殊的状态。当进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵死(尸)进程
- 僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态
#include <stdio.h>
#include <unistd.h>
#include<stdlib.h>
int main()
{
pid_t id = fork();
if(id<0){
perror("fork");
return 1;
}
else if(id>0){
printf("father[%d] is sleeping...\n",getpid());
sleep(30);
}else{
printf("child[%d] is begin Z...\n",getpid());
sleep(5);
exit(EXIT_SUCCESS);
}
return 0;
}
让父进程休眠30秒,子进程休眠5秒后退出,在此状态下的子进程就成了僵尸进程
2.孤儿进程
- 父进程如果提前退出,那么子进程后退出,进入Z状态之后,被称为孤儿进程,孤儿进程会被1号init进程领养,要由init进程回收
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{
pid_t id = fork();
if(id < 0){
perror("fork");
return 1;
}
else if(id == 0){//child
printf("I am child, pid : %d\n", getpid());
sleep(10);
}else{//parent
printf("I am parent, pid: %d\n", getpid());
sleep(3);
exit(0);
}
return 0;
}
父进程睡眠3秒后被终止,此时的子进程还未退出,就变成了孤儿进程。