C分叉,在返回PID后杀死父级

时间:2013-03-09 18:16:59

标签: c fork

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

“你必须使用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;
}

3 个答案:

答案 0 :(得分:1)

根据您给出的分配说明,我认为分配它的教师或教授对Unix机器上的英语语言或进程概念没有很好的处理。

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

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

答案 1 :(得分:1)

  

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

您的程序中没有任何地方将子ID返回给父级。唯一正在发生的通信是孩子向父母发送SIGKILL信号。

  

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

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

wait (&childState);

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

  

我想了解更多关于叉子和流程的信息,比如背后的逻辑   它们让我在编码时更加确定。

something值得关注。

答案 2 :(得分:0)

$ ./foo.bin
parent id :  6629. child id 6630
child id  :  6630. parent id 6629
dead parentKilled

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