Linux模拟实现僵尸进程

Z(zombie)-僵尸进程

  • 僵死状态(Zombies) 是一个比较特殊的状态。当进程退出并且父进程没有读取到子进程退出的返回代码是就会产生僵尸进程。
  • 僵尸进程会以终止状态保存在进程表中,并且会一直等待父进程读取退出状态代码。
  • 所以,只要子进程退出,父进程还在执行,但父进程没有读取子进程状态,子进程进入Z状态

模拟实现僵尸进程

代码

//模拟实现僵尸进程
#include 
#include 

int main()
 {
     pid_t pid;

     pid = fork();
     if(pid == -1)
        perror("创建失败");
     if(pid == 0)//孩子进程
     {
         sleep(3);
         printf("孩子进程死亡\n");
     }
     else if(pid > 0)//父进程
     {
         int times = 10;
         while(times--)
         {
             printf("父进程:%d\n",times);
             sleep(1);
         }
         printf("父进程死亡\n");
     }
     return 0;
}

测试结果

Linux模拟实现僵尸进程_第1张图片

整个程序的调用过程如上,分别在1,2,3处调用了查看进程命令,1处表示程序正常执行,2处表示孩子进程已死亡,变成孤儿进程,3处表示父进程死亡并退出。

这里写图片描述

这是第一次查看进程的结果,红色的方框表示本进程的PID,第一个黄色的方框表示父进程的PID,第二个黄色的框表示进程名,由图可知,第二个进程的PID为3340,他的父进程为3339,恰好是第一个进程的PID,由此可知第二个进程是第一个进程的子进程,这时父子进程同时在运行。

Linux模拟实现僵尸进程_第2张图片

此时表示孩子进程已死亡,但是父进程还在运行,子进程成为僵尸进程

这里写图片描述

最后父进程退出,系统回收资源,并将子进程的资源同时回收,进程消失。

僵尸进程的危害

  • 进程的退出状态必须被维持下去,因为他要告诉关心他的进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果一直不读取,那子进程就一直处于Z状态。
  • 维护退出状态本身就要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB一直都要维护。
  • 如果一个父进程创建了很多子进程,都不会回收,就会造成内存资源浪费。因为数据结构对象本身就要占内存。

怎么避免僵尸进程

为了避免僵尸进程,我们要学会使用wait()系统调用,在子进程死亡时,让父进程做出回应。

你可能感兴趣的:(linux)