linux之僵尸进程、孤儿进程

论坛 期权论坛 脚本     
匿名技术用户   2020-12-23 09:55   26   0

  僵尸进程即为进程已经执行完毕,但是其父进程没有调用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查看是否有僵尸进程存在。
  这里写图片描述
  这里写图片描述
  在另一个终端使用ps -ef查看。defunct为僵尸进程的标志。
  这里写图片描述
  僵尸进程的结束方法:
  1.>ps -aux:然后在里面找
  这里写图片描述
  2.>ps -A | grep defunct:直接显示僵尸进程
  这里写图片描述
  发现系统中有一个Zombie的僵尸进程。
  再查看就是进程的uid,pid等信息。
  $ ps -ef | grep defunct | more
  最后使用kill -9 ppid杀死僵尸进程的父进程,将僵尸进程变为一个孤儿进程,被init进程接收,然后被init进程处理掉。
  这里写图片描述
  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,他就是孤儿进程。
  这里写图片描述
  这里写图片描述
  我们可以发现这个子进程的ppid为1,即表示这个子进程的父进程为1号进程,也就是init进程。表示:当创建出来的这个孤儿进程编程孤儿进程后,就有init进程“领养”。
  
  

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP