浅析僵尸进程和孤儿进程

版权声明:本文为博主原创文章,欢迎转载,转载请声明出处! https://blog.csdn.net/hansionz/article/details/82829587

一.僵尸进程

1.什么是僵尸进程(zombie)

子进程退出并且父进程没有读取到子进程退出的返回代码时就会产生僵尸进程。僵尸进程会以终止状态保持在进程中,并且会一直在等待父进程读取退出状态代码。因此只要子进程退出父进程还在运行但是父进程没有读取子进程状态,子进程进入Z状态。

2.一个维持30秒僵尸进程的例子

  1 #include<stdio.h>
  2 #include<sys/types.h>
  3 #include<unistd.h>
  4 #include<stdlib.h>
  5 
  6 int main()
  7 {
  8     pid_t id=fork();
  9     if(id<0){
 10         perror("use fork");
 11         exit(1);
 12     }
 13     else if(id==0){//child
 14         printf("child[%d] is begin Z...\n",getpid());
 15         sleep(5);
 16         exit(0);
 17     }
 18     else{//parent
 19         printf("parent[%d] is sleeping...\n",getpid());
 20         sleep(30);
 21     }
 22     return 0;                                                                                                                     
 23 }

运行结果如下:
在这里插入图片描述

3.僵尸进程的危害

子进程的退出状态会一直被维持下去,维护退出状态本身就是要用数据维护,也属于进程基本信息,被保存在task_struct中。也就是说只要Z状态不退出,那么PCB要一直维护退出信息。如果一个父进程创建了很多的子进程,都不进行回收,就会造成内存资源的极大浪费,也会造成内存泄露

二.孤儿进程

1.什么是孤儿进程

父进程提前退出子进程就称为“孤儿进程”。一旦父进程退出子进程要退出的时候就是Z状态,因为没有进程接收它的退出信息,所以孤儿进程要被1号init进程领养回收,从而避免子进程变为僵尸进程。

2.一个例子说明孤儿进程

 #include<stdio.h>
 #include<sys/types.h>
 #include<unistd.h>
 #include<stdlib.h>

 int main()
 {
     pid_t id=fork()
     if(id<0){
         perror("use fork");
        exit(1);
    }
     else if(id==0){//child
          printf("I am child,pid is [%d],My parent is[%d]\n",getpid(),getppid());                                                   
          sleep(10);
      }
      else{//parent
        printf("I am parent ,pid is [%d]\n",getpid());
        sleep(2);
        exit(0);
     }
      return 0;
  }

猜你喜欢

转载自blog.csdn.net/hansionz/article/details/82829587