1

在正常的一天,当一个进程被杀死时,它的所有子进程都必须附加到“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 了?

4

1 回答 1

3

在 POSIX 中,要接收和处理信号(终止进程就是处理信号),必须调度进程。在此之前,信号被认为是未决的,并且该过程仍然存在。

当进程实际终止并从内核数据结构中删除时,子进程可能是孤立的。

于 2019-08-31T20:02:58.840 回答