使用代码模拟实现僵尸进程, 孤儿进程的场景。
僵尸进程产生原因:
1. 子进程先于父进程退出。
2. 子进程退出为了保存自己的退出原因,因此这个退出后资源不会被完全释放,等待父亲进程来获取退出状态,然后释放进程所有资源。
3. 假如父进程没有关心子进程的退出,那么这个时候这个子进程将成为一个僵尸进程,占用着资源而不释放。
危害:资源泄露,正常进程可能无法创建
#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
int main()
{
pid_t pid=fork();
if(pid<0)
{
printf("error:%d\n",getpid());
return -1;
}
else if(pid>0)
{
printf("Parent is sleeping!:%d\n",getpid());
sleep(50);//父进程处于可中断睡眠状态
//,无暇关注子进程的退出状态
}
else
{
printf("Child will exit!!:%d\n",getpid());
exit(0);//子进程退出了
}
return 0;
}
可以看到父进程的id是3646,子进程的id是3647,父进程处于S+(前台可中断睡眠状态),子进程处于Z+(前台僵尸进程状态)。当然父进程在睡够50秒之后还是会去接受子进程的死亡状态,释放子进程的资源,可以说我们模拟的僵尸进程是暂时僵尸,要是一直僵尸是很可怕的。
孤儿进程:
父进程先于子进程退出,那么子进程就成为了孤儿进程,这个孤儿将被孤儿院init进程领养。
#include <stdio.h>
#include <unistd.h>
#include <stdint.h>
#include <stdlib.h>
int main()
{
uint64_t i = 0;
int pid = -1;
pid = fork();
if (pid < 0) {
return -1;
}else if (pid == 0) {
printf("child:%d\n",pid);
sleep(10);//子进程还在睡觉,它成了孤儿
}
else{
printf("parent%d\n",pid);
sleep(1);
exit(0);//父进程退出了
}
while(1)
{
sleep(1);
}
return 0;
}
父进程先于子进程退出,子进程被init进程(进程id为1的进程收养,有init进程对子进程进行资源回收)。