在正常的一天,当一个进程被杀死时,它的所有子进程都必须附加到“init”进程(所有进程的曾祖父)。奇怪的是,XV6 似乎没有这样做。下面是 XV6 中 proc.c 文件中 'kill' 函数的代码
int kill(int pid)
{
struct proc * p;
acquire(&ptable.lock);
for(p = ptable.proc; p < &ptable.proc[NPROC]; p++){
if(p->pid == pid){
p->killed = 1;
if(p->state == SLEEPING)
p->state = RUNNABLE;
release(&ptable.lock);
return 0;
}
}//end of for loop
release(&ptable.lock);
return -1;
}
为什么没有从进程表中删除被杀死的进程?
为什么它的孩子不被“init”收养?
看在上帝的份上,为什么被杀死的进程又变成 RUNNABLE 了?