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

时间:2011-11-22 13:26:55

标签: c linux process ipc

我正处于这种奇怪的行为,我有我的主程序和分叉的孩子。它们是这样的管道(数字是文件描述符):

 ___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,这是正确的。

为什么父母会死?

2 个答案:

答案 0 :(得分:13)

父节点在子节点退出后写入fd 1或fd 2的任何尝试都将导致内核向父节点发送SIGPIPE。 SIGPIPE的默认行为是进程终止。这可能是发生了什么。

答案 1 :(得分:2)

你需要处理SIGPIPESIGCHLD信号 - 可能只是忽略它们 - 你应该没问题。