我正处于这种奇怪的行为,我有我的主程序和分叉的孩子。它们是这样的管道(数字是文件描述符):
___parent___
| | ____child_____
| 0 stdin | | |
| 1 pipe1[1]----------. | 1 stdout |
| 2 pipe2[1]----------.\ | 2 stderr |
|____________| \`----------> 3 pipe1[0] |
`----------> 5 pipe2[0] |
|______________|
因此父级从 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,这是正确的。
为什么父母会死?
答案 0 :(得分:13)
父节点在子节点退出后写入fd 1或fd 2的任何尝试都将导致内核向父节点发送SIGPIPE。 SIGPIPE的默认行为是进程终止。这可能是发生了什么。
答案 1 :(得分:2)
你需要处理SIGPIPE
和SIGCHLD
信号 - 可能只是忽略它们 - 你应该没问题。