Linux管道作为输入和输出

Nev*_*hoe 3 c linux ipc pipe

我想在Linux操作系统上的C程序中执行以下操作:

  • 使用系统调用(或2)创建PIPE
  • 使用exec()执行新进程
  • 将进程的STDIN连接到先前创建的管道.
  • 将流程的输出连接到另一个PIPE.

我们的想法是为了性能目的绕开任何驱动器访问.

我知道使用PIPE系统调用创建管道非常简单,并且我可以使用popen来创建用于输入或输出目的的管道.

但是你会如何为输入和输出做这个呢?

Jon*_*ler 7

您需要非常小心管道:

  1. 调用pipe()两次,一次用于管道到子级,一次用于管道从子级,产生4个文件描述符.
  2. 调用fork().
  3. 在孩子:
    • 在标准输入(文件描述符0)上调用close().
    • 调用dup() - 或dup2() - 使管道到子的读取结束为标准输入.
    • 在pipe-to-child的read end上调用close().
    • 在pipe-to-child的write end上调用close().
    • 在标准输出(文件描述符1)上调用close().
    • 调用dup() - 或dup2() - 使管道从子进入标准输出
    • 在来自子项的管道的写入端调用close().
    • 在从子管道读取结束时调用close().
    • 执行所需的程序.
  4. 在父母:
    • 在管道到孩子的读取结束时调用close.
    • 在从子管道写入结束时调用close.
    • 循环将数据发送到管道到子的写入端的子节点,并从子节点的读取端读取子节点上的数据
    • 当不再发送给孩子时,关闭管道到孩子的结束.
    • 收到所有数据后,关闭管道从孩子的读取结束.

注意有多少关闭,特别是在孩子.如果使用dup2(),则不必显式关闭标准输入和输出; 但是,如果您执行显式关闭,dup()可以正常工作.另请注意,dup()和dup2()都不会关闭重复的文件描述符.如果省略关闭管道,则两个程序都无法正确检测到EOF; 当前进程仍然可以写入管道这一事实意味着管道上没有EOF,程序将无限期挂起.

请注意,此解决方案不会改变孩子的标准错误; 它与父级的标准错误位于同一位置.通常,这是正确的.如果您有特定要求来自子项的错误消息的处理方式不同,那么也要对子项的标准错误采取适当的操作.