Linux进程讲解 四 孤儿进程

  上次我们介绍了僵尸进程,僵尸进程是进程的一种状态,我们今天说的是孤儿进程,孤儿进程并不是进程的一种状态,它是一类进程的名字,僵尸进程是因为我们的子进程突然死亡,并且我们的父进程没有查看他的死亡原因,他就会一直保留着自己的task_struct里边存储着他的一些死亡信息等等,这就形成了僵尸进程,孤儿进程和僵尸进程相反,孤儿进程顾名思义就是我们的父进程死亡了,但是我们的子进程依然存在,孤儿进程最后都会由pid=1的init进程收养,并且在子进程结束之后由init进程给他“收尸”,因此一般来说孤儿进程是没有什么危害的。

  这里我们通过一段程序来制造一个孤儿进程。

 1 #include

  2 #include

  3 #include

  4 #include

  5 #include

  6

  7 int main()

  8 {

  9    pid_t id=fork()

 10    if(id<0)

 11    {

 12        perror("fork erroe\n");

 13        return -1;

 14    } else if(id==0)

 15    {

 16        printf("child: %d\n",getpid());

 17        sleep(30);

 18    }

 19    else

 20    {

 21      printf("parent: %d\n",getpid());

 22      sleep(3);

 23      exit(0);                                                                                                                                                      

 24    }

 25    return 0;

 26 }

这里还要介绍到一个指令就是ps axj之前介绍过一点点ps他的选项有很多

Linux进程讲解 四 孤儿进程_第1张图片

这里主要是看PPID,PPID是当前进程的父进程。因为我们的孤儿进程后边会被init进程收养所以我们需要通过这个指令来看孤儿进程的父进程是如何变化的。

我们现在一个终端下执行我们的程序

Linux进程讲解 四 孤儿进程_第2张图片

在父进程sleep几秒这段时间里可以看到,子进程2603的PPID也就是父进程就是我们的2602,但是过了这几秒之后就能看到我们的父进程已经没有了,子进程的2603的PPID变成了init的进程号1.并且会收集他们的完成状态,init进程就好像是一个民政局,专门负责处理孤儿进程的善后工作。每当出现一个孤儿进程的时候,内核就把孤 儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会代表党和政府出面处理它的一切善后工作。因此孤儿进程并不会有什么危害。

你可能感兴趣的:(个人总结,Linux,Linux讲解)