Linuxpipe道作为input和输出

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

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

这个想法是为了规避任何驱动器访问的性能目的。

我知道使用PIPE系统调用创buildpipe道非常简单,我可以使用popen创build一个用于input或输出目的的pipe道。

但是,如何在input和输出上做到这一点呢?

Solutions Collecting From Web of "Linuxpipe道作为input和输出"

你需要非常小心的管道:

  1. 调用pipe()两次,一次是pipe-to-child,一次是pipe-from-child,产生4个文件描述符。
  2. 调用fork()。
  3. 在小孩:
    • 在标准输入(文件描述符0)上调用close()。
    • 调用dup() – 或dup2() – 使管道到子进程的读取结束为标准输入。
    • 在pipe-to-child读取结束时调用close()。
    • 在pipe-to-child的写入结束时调用close()。
    • 在标准输出(文件描述符1)上调用close()。
    • 调用dup() – 或dup2() – 将管道从子进行写入结束为标准输出
    • 在pipe-from-child的写入结束处调用close()。
    • 在pipe-from-child的读取结束处调用close()。
    • 执行所需的程序。
  4. 在父母:
    • 在管道到孩子的读取结束时调用close。
    • 在从小孩的写入结束时调用close。
    • 在pipe-to-child的写入结束时将数据循环发送给子,并且从pipe-from-child的读取结束从子读取数据
    • 当没有更多的发送给孩子,关闭写对孩子的结束。
    • 当收到所有的数据时,关闭读取管道的结束。

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

请注意,此解决方案不会改变孩子的标准错误; 它和父母的标准错误一样。 通常这是正确的。 如果您有特定的要求来自孩子的错误消息的处理方式不同,请对孩子的标准错误采取适当的措施。

根据您的需要,您可能会发现只需使用mkfifo(1)来创建命名管道,并让您的进程读取/写入该文件更容易。 当文件在文件系统中被命名时,使用匿名管道的开销不应该是可观的。

最简单的方法可能是执行/bin/sh ,这样你可以使用熟悉的shell语法来指定管道并卸载所有的复杂性。

就像是:

 execlp("sh", "-c", "cat /dev/zero | cat > /dev/null", NULL);