Linux 用管道输出文件,c – Linux管道作为输入和输出

我想在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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值