【问题标题】:C forks, kill the parent after returning its PIDC分叉,返回PID后杀死父级
【发布时间】:2013-03-09 18:16:59
【问题描述】:

我是 C 新手,过去两周我一直在调查 forks,我必须为我的操作系统课程解决这个问题:

“你必须使用fork创建一个“重量级”进程,然后第一个进程必须等待第二个(新的)返回它的父ID,然后它必须杀死它的父并完成”

我认为说明很混乱,这是我目前的代码(正如我所说,我是 C 新手,所以我一直在调查) 我的问题似乎是父进程甚至没有等待子进程返回其 ID,因为在那之后,子进程正在杀死父进程,所以我想我正在创建子进程,当它运行时它会杀死父母最后,不让父母等待孩子执行。 (这是我认为对说明感到困惑的部分) 我想了解更多关于分叉和流程的信息,比如它们背后的逻辑,以便在编码时更有把握。 谢谢!

#include <sys/types.h>
#include <wait.h>
#include <unistd.h>
#include <stdio.h>


int main() {
    pid_t idProceso;
    int childState;

    idProceso = fork();

    if (idProceso == 0){
        printf ("child id  :  %d. parent id %d\n", 
        getpid(), getppid());

            int parent = getppid();
            kill(parent, SIGKILL);
            printf ("dead parent"); //  not sure about it  ??
            _exit();
    }

    if(idProceso > 0){
        sleep (1);
        printf ("parent id :  %d. child id %d\n", 
        getpid(), idProceso);

        wait (&childState);

    }

    return 0;
}

【问题讨论】:

  • 说实话,这句话——即使读了两遍——对我来说也没有任何意义。在所有情况下,我都可以认为被杀死的进程已经退出。
  • 我不明白你应该做什么,但父母不等待的原因是因为它启动了sleep,但孩子设置为立即杀死它,所以这样做。
  • 你们说的都对,我的意思是,我觉得这句话很混乱,但老师是这样给我们的。就像: - 创建一个进程 - 创建一个子进程 - 父进程等待子进程 - 子进程杀死父进程(这是我很困惑的部分)并且它完成了

标签: c fork


【解决方案1】:

根据您提供的作业描述,我认为分配它的讲师或教授对英语或 Unix 机器上的进程概念没有很好的掌握。

您提出的解决方案是合理的,但我会删除睡眠调用。 Childstate 永远不会设置正确,您也不需要全部。此外,不要将 SIGKILL 发送给父级。 SIGKILL 是尝试终止进程的最后一种方法。我建议将 SIGTERM 发送到父进程。如果您使用的是 Linux 机器,父进程可以使用 sigaction 安装信号处理程序。在信号处理程序中,您可以打印一条很好的消息,例如“收到来自子进程的终止信号”并调用 exit。如果你这样做了,你的教授可能会对你的技能印象深刻,从而给你及格分数。

如果做不到这一点,我会要求一个更好的问题。在真正解决问题之前,我必须将语法和标点符号更正提交给教授批准,这种情况并不少见。

【讨论】:

    【解决方案2】:

    我的问题似乎是父母甚至没有等待 子进程返回其id

    在您的程序中,孩子没有将其 id 返回给父母。唯一发生的通信是子进程向父进程发送 SIGKILL 信号。

    所以我想我正在创建子进程,当它运行时它会杀死 父母最后,不让父母等待孩子 执行。

    是的,你是对的,子进程会通过发送 SIGKILL 信号,使用 kill() 函数杀死父进程,但父进程实际上是在等待被子进程杀死。

    wait (&childState);
    

    这让父级等待(挂在那里)子级终止,终止后,父级将继续前进,但是在您的程序中,当父级等待子级终止时,子级本身将终止等待期间的父母。

    我想了解更多关于分叉和进程的信息,比如背后的逻辑 让我在编码时更有把握。

    这是something值得一看。

    【讨论】:

      【解决方案3】:
      $ ./foo.bin
      parent id :  6629. child id 6630
      child id  :  6630. parent id 6629
      dead parentKilled
      

      我刚刚删除了sleep(1),输出似乎是合理的。

      【讨论】:

      • 是的,这与我目前收到的结果相同,我唯一要确定的是父母是否真的在等待(我在 wait() 之前和之后都放了一个 printf 但没有其中正在打印)
      • parent id : ..... child id ... 来自parent 进程,没有合理的理由让parent 进程停止。所以它一直处于等待状态。但是,如果您真的想进入下面的级别,请使用调试器或调用跟踪器。
      猜你喜欢
      • 2012-01-03
      • 2017-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-14
      • 2014-02-18
      • 2018-07-30
      • 1970-01-01
      相关资源
      最近更新 更多