在Fork,C之后麻烦杀死父进程

时间:2014-11-23 08:44:04

标签: c pipe signals fork

我正在尝试刷新一些C技能,而且我正在使用代码来分叉并在两个进程之间进行通信。

在下面的程序中,我预计孩子的SIGINT信号会导致父母在打印孩子已经死亡之前终止。但是,消息“Parent:chlid is dead”仍然是最后要打印的内容。

我有什么遗失的吗?

感谢。

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

int main() {
    char *msg;
    int forkval, parentpid;
    int p2c[2];

    pipe(p2c);

    forkval = fork();

    if (forkval < 0) exit(EXIT_FAILURE);

    if (forkval) { /* Parent */
        msg = "Parent: reporting\n";
        close(p2c[0]);
        write(STDOUT_FILENO,msg,strlen(msg));
        write(p2c[1], &forkval, sizeof(int));
        close(p2c[1]);
        wait(NULL);
        msg = "Parent: chlid is dead\n";
        write(STDOUT_FILENO, msg, strlen(msg));
    } else { /* Child */
        msg = "Child: reporting\n";
        close(p2c[1]);
        write(STDOUT_FILENO,msg,strlen(msg));
        read(p2c[0], &parentpid, sizeof(int));
        close(p2c[0]);
        fprintf(stdout, "Child: parent's pid is %i\n", parentpid);
        kill(parentpid,SIGINT);
        fprintf(stdout, "Child: dying\n");
    }
    exit(EXIT_SUCCESS);
}

终端输出:

Parent: reporting
Child: reporting
Child: parent's pid is 10940
Parent: chlid is dead

1 个答案:

答案 0 :(得分:1)

fork返回的非零值是孩子的pid。因此,孩子正在自杀,这就是为什么你没有看到孩子的"Child: dying"消息,但确实看到了来自父母的最后一条消息。