C 杀死分叉的孩子杀死父母?

C 杀死分叉的孩子杀死父母?,c,linux,process,ipc,C,Linux,Process,Ipc,我喜欢这种奇怪的行为,我有我的主程序和一个分叉的孩子。它们是这样传输的(数字是文件描述符): 所以父级从stdin获取输入,但将stdout和stderr重定向到两个管道。子级已关闭其stdin并使用管道的读取端 然后我有一个功能,可以杀死这个孩子: void killChild(){ printf("Killing %d\n", (int)childID); fflush(stdout); kill(childID, SIGKILL); waitpid(childID, NUL

我喜欢这种奇怪的行为,我有我的主程序和一个分叉的孩子。它们是这样传输的(数字是文件描述符):

所以父级从stdin获取输入,但将stdout和stderr重定向到两个管道。子级已关闭其stdin并使用管道的读取端

然后我有一个功能,可以杀死这个孩子:

void killChild(){
  printf("Killing %d\n", (int)childID);
  fflush(stdout);
  kill(childID, SIGKILL);
  waitpid(childID, NULL, 0);   // getting rid of the zombie
}
孩子被成功杀死,但问题是父母本身也被杀死。我检查了孩子的PID,结果是正确的


那么为什么父级会死亡呢?

在子级退出后,父级尝试写入其fd 1或fd 2将导致内核向父级发送SIGPIPE。SIGPIPE的默认行为是进程终止。这可能就是发生的情况。

你需要处理
SIGPIPE
SIGCHLD
信号-可能只是忽略它们-你应该没事。

我喜欢这个问题的名字。还有艺术。父母收到了什么信号?在杀死孩子后,父母是否试图写入stdout或stderr?如果是这样的话,它会因为SIGPIPE而死亡。你是不是在改变对SIGCHLD的处理方式?也许等待被终止的孩子们是个好主意,你知道,僵尸……这确实是个问题。只需
close()
ing父级中的管道即可解决此问题。现在我只需要找到一种方法来重置stdout和stderr。@Pithikos dup()stdout/stderr,然后再创建管道。关闭管道后,dup2()再次将它们返回到文件描述符1/2。
void killChild(){
  printf("Killing %d\n", (int)childID);
  fflush(stdout);
  kill(childID, SIGKILL);
  waitpid(childID, NULL, 0);   // getting rid of the zombie
}