进程退出为Z状态的原因

A进程fork生成B进程,A通过waitpid等待B进程。
B通过pthread_create生成一个线程C。
A,B,C都在CPU1。 CPU1上绑定一个死循环fifo进程L。
A,B,C的优先级都比L高。

通过kill -9 B杀死进程。
B进入Z状态等待回收,C执行到flush_cpu_workqueue的时候等待eventd/1完成,
由于L的死循环导致eventd/1被抢占,从而C一直处于D状态;
A在waitpid的时候会遍历B的所有子线程,等待所有子线程进入Z或者STOP状态,否则就不回收B。
导致B一直为Z状态。

附do_wait的核心代码
repeate:
 flag = 0;
list_for_each(_p,&tsk->children){
 //检查子线程p是否是tsk的线程组的成员,
  并且如果p是线程组的组长的话,则返回2
  ret = eligible_child(pid, options, p);
  if (!ret)
 continue;
  switch (p->state){
    case xxxx:
     flag = 1;
    case EXIT_ZOMBIE:
    if (ret == 2)
      goto check_continued; //如果是组长就不能回收Z状态
    wait_task_zombie(p); //将子线程p的状态强制改为DEAD,然后回收进程结构
     break;
  }
  if (flag) { //如果是非DEAD,Z状态,则会调度出去,等待下一次子进程进入Z后,通过
       notify_parent唤醒父进程继续检查waitpid
 schedule();
 goto repeat;
  }

}
}

你可能感兴趣的:(c,list,kill,each)