目录
孤儿进程与僵尸进程
孤儿进程
父亲死了,子进程被init进程领养。(无危害)
如下,就创建了一个孤儿进程:
#include <stdio.h>
#include <unistd.h>
int main()
{
pid_t pid = fork();
if(pid == 0 ){
while(1){
printf("I am child,pid=%d,ppid=%d\n",getpid(),getppid());
sleep(1);
}
}else if(pid > 0){
printf("I am parent,pid=%d,ppid=%d\n",getpid(),getppid());
sleep(5);
printf("I am parent,I will die!\n");
}
return 0;
}
运行如下:
所谓的孤儿进程,从子进程的角度看,就是其父进程的id,变成了"1",意味着被"init"进程给收养了!
僵尸进程
子进程死了(父进程没管,没给"收尸"),父进程没有回收子进程的资源(PCB)
那么问题来了,子进程死了,为啥非要由父进程来回收,为啥不能由操作系统进行回收呢?这是因为操作系统需要让操作者知道,子进程是怎么死的,相当于是提示操作者子进程死,所以,才设置成必须由父进程来回收子进程。(有危害,僵尸进程会占用内存资源,但实际上已经停止运行了)
#include <stdio.h>
#include <unistd.h>
int main()
{
pid_t pid = fork();
if(pid == 0){
printf("I am child,pid =%d,ppid=%d\n",getpid(),getppid());
sleep(2);
printf("I am child,I will die!\n");
}
else if(pid > 0){
while(1){
printf("I am father,very happy,pid=%d\n",getpid());
sleep(1);
}
}
return 0;
}
这样就创建了一个僵尸进程:
如何回收僵尸进程
回收方法:杀死父亲,init领养,负责回收。