您需要对管道非常小心:
- 调用pipe()两次,一次用于子级管道,一次用于子级管道,产生4个文件描述符。
- 调用fork()。
- 在儿童中:
- 在标准输入(文件描述符0)上调用close()。
- 调用dup()-或dup2()-以将管道到子级的读取结束作为标准输入。
- 在管道到子项的读取端调用close()。
- 在管道到子项的写入端调用close()。
- 在标准输出(文件描述符1)上调用close()。
- 调用dup()-或dup2()-将子管道的写入结束写入标准输出
- 在pipe-from-child的写入端调用close()。
- 在从子管道读取的末端调用close()。
- 执行所需的程序。
- 在父母中:
- 在读取子管道结束时调用close。
- 在子管道发送的写入端调用关闭。
- 循环在pipe-to-child的写端上将数据发送到child并在pipe-from-child的读端上从child读取数据
- 当不再发送给子代时,关闭管道到子代的写入结束。
- 收到所有数据后,关闭子管道的读取结束。
注意关闭的数量,尤其是在孩子中。如果使用dup2(),则不必显式关闭标准输入和输出。但是,如果您执行显式关闭,则dup()可以正常工作。还要注意,dup()和dup2()都不会关闭重复的文件描述符。如果忽略关闭管道,则两个程序都无法正确检测到EOF;当前进程仍可以写入管道的事实意味着管道上没有EOF,并且程序将无限期挂起。
请注意,此解决方案不会更改孩子的标准错误;它与父级的标准错误位于同一位置。通常,这是正确的。如果您有一个特殊的要求,即以不同的方式处理来自子级的错误消息,那么也应对子级的标准错误采取适当的措施。



