linux之僵尸进程、孤儿进程

  僵尸进程即为进程已经执行完毕,但是其父进程没有调用wait/waitpid,则该进程将变成一个僵尸进程,虽然没有执行,但占用系统中的一个PCB空间。僵尸进程多的话,可以将系统卡死。
  僵尸进程的实现为:使用folk创建一个子进程,让子进程进来之后很快就退出,父进程什么也不做,即没有调用wait/waitpid,所以该子进程就成为了一个僵尸进程。
  

int main()
{
    pit_t id=folk();//folk返回两个值,给父进程返回子进程的pid,给子进程返回0,所以返回0表示子进程创建成功。
    if(id == 0)
    {
        printf("this is child process\n");
        exit(1);
    }
    else
        sleep(1000);
    return 0;
}

  然后我们可以用ps -ef查看是否有僵尸进程存在。
  linux之僵尸进程、孤儿进程_第1张图片
  linux之僵尸进程、孤儿进程_第2张图片
  在另一个终端使用ps -ef查看。defunct为僵尸进程的标志。
  linux之僵尸进程、孤儿进程_第3张图片
  僵尸进程的结束方法:
  1.>ps -aux:然后在里面找
  linux之僵尸进程、孤儿进程_第4张图片
  2.>ps -A | grep defunct:直接显示僵尸进程
  linux之僵尸进程、孤儿进程_第5张图片
  发现系统中有一个Zombie的僵尸进程。
  再查看就是进程的uid,pid等信息。
  $ ps -ef | grep defunct | more
  最后使用kill -9 ppid杀死僵尸进程的父进程,将僵尸进程变为一个孤儿进程,被init进程接收,然后被init进程处理掉。
  linux之僵尸进程、孤儿进程_第6张图片
  ok,僵尸进程顺利被杀死。

  孤儿进程:
  父进程创建一个子进程后,父进程退出,留下一个子进程还在运行,则称之为孤儿进程。孤儿进程会被init进程领养。
  

int main()
{
    pid_t id=folk();
    if(id!=0)
    {
        printf("father pid:%d, father ppid:%d\n"getpid(),getppid());
        exit(1);
    }
    else
    {
        while(1)
            printf("child pid:%d, child ppid:%d\n",getpid(),getppid());
    }
    return 0;
}

  我们在用folk创建出一个子进程后,就让父进程退出,此时只留下一个还在执行的子进程,不停的打印自己的pid和ppid,他就是孤儿进程。
  linux之僵尸进程、孤儿进程_第7张图片
  linux之僵尸进程、孤儿进程_第8张图片
  我们可以发现这个子进程的ppid为1,即表示这个子进程的父进程为1号进程,也就是init进程。表示:当创建出来的这个孤儿进程编程孤儿进程后,就有init进程“领养”。
  
  

你可能感兴趣的:(Linux)