我在 XV6 中终止了进程 "A","A" 的 child 进程发生了什么
I kill process "A" in XV6 , what happens to child processes of "A"
在正常情况下,当一个进程被终止时,其所有 child 个进程必须附加到 'init' 个进程(所有进程中的大 Grand-Daddy 个)。奇怪的是,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;
}
为什么杀死的进程没有从进程table中删除?
为什么它的 children 没有被 'init' 采用?
看在上帝的份上,为什么被杀死的进程再次变为 RUNNABLE?
在POSIX中,要接收和处理信号(终止进程就是处理信号),必须安排一个进程。在那之前,信号被认为是挂起的,进程仍然存在。
当进程实际终止并从内核数据结构中删除时,子进程可能是孤立的。
在正常情况下,当一个进程被终止时,其所有 child 个进程必须附加到 'init' 个进程(所有进程中的大 Grand-Daddy 个)。奇怪的是,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;
}
为什么杀死的进程没有从进程table中删除?
为什么它的 children 没有被 'init' 采用?
看在上帝的份上,为什么被杀死的进程再次变为 RUNNABLE?
在POSIX中,要接收和处理信号(终止进程就是处理信号),必须安排一个进程。在那之前,信号被认为是挂起的,进程仍然存在。
当进程实际终止并从内核数据结构中删除时,子进程可能是孤立的。