我进入这个奇怪的行为,我有我的主程序和分叉的孩子。他们管道像这样(的数字文件描述符):杀死分叉的孩子杀死父母吗?
___parent___
| | ____child_____
| 0 stdin | | |
| 1 pipe1[1]----------. | 1 stdout |
| 2 pipe2[1]----------.\ | 2 stderr |
|____________| \`----------> 3 pipe1[0] |
`----------> 5 pipe2[0] |
|______________|
所以家长获取输入从标准输入但重定向标准输出和标准错误两个管道。该孩子已关闭其标准杆,并使用管道的读取端。
然后,我有一个函数只杀死孩子:
void killChild(){
printf("Killing %d\n", (int)childID);
fflush(stdout);
kill(childID, SIGKILL);
waitpid(childID, NULL, 0); // getting rid of the zombie
}
孩子被成功地杀死了,但问题是,父母本身就会被杀死为好。我检查了孩子的PID,这是正确的。
那么,为什么父母死了?
我喜欢这个问题的名称。和艺术。 – Gabe
父母收到了什么信号? – hochl
在杀死孩子后父母是否尝试写入stdout或stderr?如果是这样,它因SIGPIPE而死亡。你在改变SIGCHLD的处理吗? –