【发布时间】:2020-01-04 13:22:00
【问题描述】:
在正常的一天,当一个进程被杀死时,它的所有子进程都必须附加到“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 了?
【问题讨论】:
-
@JL2210 你很可能错了。致 OP:这在 Linux 和其他现代 Unices 中大致相同:
kill不会直接杀死进程,而是命令它提交 seppuku(它将在第一次执行而不是返回用户空间),如果它正在睡觉,它会唤醒它以便能够这样做。 -
该函数上方的comment 也是如此。 init 收养的孩子将happen in
exit()在同一个源文件中。 -
@mosvy 很好。没注意到。