4

我是 C 的新手,过去两周我一直在研究分叉,我必须为我的 Operative Systems 课程解决这个问题:

“您必须使用分叉创建一个“重量级”进程,然后第一个进程必须等待第二个(新进程)返回其父 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;
}
4

3 回答 3

1

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

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

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

于 2013-03-09T18:42:22.517 回答
1

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

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

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

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

wait (&childState);

这使得父级等待(挂在那里)子级终止,终止后,父级将继续,但是在您的程序中,当父级等待子级终止时,子级本身将终止父级等待。

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

这是值得一看的。

于 2013-03-09T18:45:35.553 回答
1
$ ./foo.bin
parent id :  6629. child id 6630
child id  :  6630. parent id 6629
dead parentKilled

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

于 2013-03-09T18:54:26.683 回答