我想在Linux操作系统上的C程序中执行以下操作:
>使用系统调用(或2)创建PIPE
>使用exec()执行新进程
>将进程的STDIN连接到先前创建的管道.
>将流程的输出连接到另一个PIPE.
我们的想法是为了性能目的绕开任何驱动器访问.
我知道使用PIPE系统调用创建管道非常简单
并且我可以使用popen来创建用于输入或输出目的的管道.
但是你会如何为输入和输出做这个呢?
解决方法:
您需要非常小心管道:
>两次调用pipe(),一个用于管道到子节点,一个用于管道从子节点,产生4个文件描述符.
>调用fork().
>在孩子:
>在标准输入(文件描述符0)上调用close().
>调用dup() – 或dup2() – 使管道到子的读取结束为标准输入.
>在pipe-to-child的读取结束时调用close().
>在pipe-to-child的write end上调用close().
>在标准输出(文件描述符1)上调用close().
>调用dup() – 或dup2() – 使管道从子进入标准输出
>在子管道的写入端调用close().
>在从子管道读取结束时调用close().
>执行所需的程序.
>在父母:
>在管道到孩子的读取结束时调用close.
>在来自孩子的管道的写入结束时调用close.
>循环将数据发送到管道到子的写入端的子节点,并从子节点读取端的子节点读取数据
>当不再发送给孩子时,关闭管道到孩子的结尾.
>收到所有数据后,关闭管道从孩子的读取结束.
注意有多少关闭,特别是在孩子.如果使用dup2(),则不必显式关闭标准输入和输出;但是,如果您执行显式关闭,dup()可以正常工作.另请注意,dup()和dup2()都不会关闭重复的文件描述符.如果省略关闭管道,那么两个程序都无法正确检测到EOF;当前进程仍然可以写入管道这一事实意味着管道上没有EOF,程序将无限期挂起.
请注意,此解决方案不会改变孩子的标准错误;它与父级的标准错误位于同一位置.通常,这是正确的.如果您有特定的要求,来自子项的错误消息的处理方式不同,那么也要对子项的标准错误采取适当的操作.
标签:c-3,linux,pipe,ipc
来源: https://codeday.me/bug/20190726/1547284.html