我想在Linux操作系统的C程序中执行以下操作:
这个想法是为了规避任何驱动器访问的性能目的。
我知道使用PIPE系统调用创buildpipe道非常简单,我可以使用popen创build一个用于input或输出目的的pipe道。
但是,如何在input和输出上做到这一点呢?
你需要非常小心的管道:
注意有多少关闭,特别是在孩子。 如果使用dup2(),则不必显式关闭标准输入和输出; 但是,如果您执行显式关闭,则dup()可以正常工作。 另请注意,dup()和dup2()都不会关闭重复的文件描述符。 如果省略关闭管道,那么这两个程序都不能正确检测到EOF; 当前进程仍然可以写入管道的事实意味着管道上没有EOF,程序将无限期地挂起。
请注意,此解决方案不会改变孩子的标准错误; 它和父母的标准错误一样。 通常这是正确的。 如果您有特定的要求来自孩子的错误消息的处理方式不同,请对孩子的标准错误采取适当的措施。
根据您的需要,您可能会发现只需使用mkfifo(1)来创建命名管道,并让您的进程读取/写入该文件更容易。 当文件在文件系统中被命名时,使用匿名管道的开销不应该是可观的。
最简单的方法可能是执行/bin/sh
,这样你可以使用熟悉的shell语法来指定管道并卸载所有的复杂性。
就像是:
execlp("sh", "-c", "cat /dev/zero | cat > /dev/null", NULL);