我正在尝试刷新一些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
答案 0 :(得分:1)
fork
返回的非零值是孩子的pid
。因此,孩子正在自杀,这就是为什么你没有看到孩子的"Child: dying"
消息,但确实看到了来自父母的最后一条消息。