浅谈僵尸进程与孤儿进程

一、僵尸进程

定义:僵尸进程是子进程先于父进程结束,此时没有回收子进程,释放子进程占用的资源,此时子进程就叫做僵尸进程,僵尸外文名叫:zombie,因此僵尸进程在Linux状态下简称Z
如果这时父进程结束了, 那么init进程自动会接手这个子进程,为它收尸,它还是能被清除的。但是如果如果父进程是一个循环,不会结束,那么子进程就会一直保持僵尸状态。

在这里插入图片描述

僵尸进程的实现

  1. 实现僵尸进程我们只需要在代码中创建两个进程,让子进程退出,父进程循环输出,来达到目的。
#include<stdio.h>
#include<unistd.h>
int main()
{
    
    
  pid_t ret=fork();//创建子进程
  if(ret<0)
  {
    
    
    return 0;
  }
  else if(ret==0)
  {
    
    

    printf("I am child,pid is:%d\n",getpid());
    printf("My father pid is:%d\n",getppid());
  }
  else 
  {
    
    
    while(1)
    {
    
    
      printf("I am father,pid is %d\n",getpid());
      printf("My father pid is:%d\n",getppid());
      sleep(1);
    }
  }
  return 0;
}

让程序运行起来之后我们分析父子进程:

1. 父进程PID为:20518
2. 子进程PID为:20520

在这里插入图片描述

我们使用指令 ps aux | grep main 来查看父进程与子进程的信息会发现子进程已经变成了Z

僵尸进程的危害

  1. 僵尸进程会占用系统资源,如果有很多僵尸进程,就会没有可用的进程号导致系统不能创建新进程

如何处理僵尸进程

使用命令 kill -9 [pid]

孤儿进程

一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。孤儿进程是没有父进程的进程。每当出现一个孤儿进程的时候,内核就把孤儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会代表党和政府出面处理它的一切善后工作。因此孤儿进程并不会有什么危害

创建一个孤儿进程:让子进程陷入循环,父进程先退出

#include<stdio.h>
#include<unistd.h>
int main()
{
    
    
  pid_t ret=fork();
  if(ret<0)
  {
    
    
    return 0;
  }
  else if(ret==0)
  {
    
    
    while(1)
    {
    
    
      printf("I am child,pid is:%d\n",getpid());
      printf("my father pid is:%d\n",getppid());
      sleep(1);
    }
  }
  else 
  {
    
    
    printf("I am father,pid is:%d\n",getpid());
    printf("my father pid is:%d\n",getppid());
  }
  return 0;
}

在这里插入图片描述
我们可以看到这个孤儿进程已经被一号进程领养。

猜你喜欢

转载自blog.csdn.net/ahuyccc/article/details/115305397