【问题标题】:I kill process "A" in XV6 , what happens to child processes of "A"我在 XV6 中杀死进程“A”,“A”的子进程会发生什么
【发布时间】: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 很好。没注意到。

标签: c unix xv6 sysv


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 2019-06-14
    • 2016-01-24
    • 1970-01-01
    相关资源
    最近更新 更多