+ -
当前位置:首页 → 问答吧 → “孤儿进程”处理问题。

“孤儿进程”处理问题。

时间:2010-12-06

来源:互联网

本帖最后由 dooros 于 2010-12-06 16:23 编辑

问题源自:《linux内核设计与实现 第二版》 进程章节

父进程在子进程退出之前退出,他的子进程就成了孤儿进程。
孤儿进程的处理方法是给子进程在当前线程组内找一个线程作为父亲,如果不行就让init做他们的父亲。

当前线程组是指子进程的线程组?还是父进程的线程组?
内核原文注释如下:

/*
* When we die, we re-parent all our children.
* Try to give them to another thread in our thread
* group, and if no such member exists, give it to
* the global child reaper process (ie "init")
*/

应该是父进程进程组的其他进程作为此父进程的子进程的父亲吧?

代码如下:
  1. struct task_struct *p,*reaper=father;
  2. struct list_head *list;

  3. if(father->exit_signal!=-1)        //这句话是父进程是否退出的判断?
  4.         reaper=pre_thread(reaper);        //如果父进程退出了,在自己的进程组内找个父亲?
  5. else
  6.         reaper=child_reaper;        //这句话什么作用?

  7. if(reaper==father)
  8.         reaper=child_reaper;        //child_reaper是init进程?


  9. list_for_each(list,&father->children){
  10.         p=list_entry(list,struct task_struct,sibling);
  11.         reparent_thread(p,reaper,child_reaper);        //p是当前进程,reaper是父进程,child_reaper是init进程?这个函数?
  12. }
复制代码
代码里有些不明白的地方,希望大家能帮忙讲解下,谢谢了。


不知道这本书上述代码是怎么来的?
此书用的是2.6.10的源代码,我查看了下源代码,如下:
  1. do {
  2.                 reaper = next_thread(reaper);
  3.                 if (reaper == father) {
  4.                         reaper = child_reaper;
  5.                         break;
  6.                 }
  7.         } while (reaper->exit_state >= EXIT_ZOMBIE);
复制代码
这就非常清楚了。

作者: dooros   发布时间: 2010-12-06

child_reaper 就是 init 进程吧。
  1. struct task_struct *child_reaper = &init_task;
复制代码

作者: amarant   发布时间: 2010-12-06