多管道

时间:2011-08-01 20:05:58

标签: exec fork pipe dup2

绝望,我正在寻找一个月的多管道链接的参考/源代码,这意味着我可以运行一些东西:

     cat /tmp/test.log  | wc -l --> stdout
                        | grep test1 --> stdout
                        | grep test2 | grep test3 |
                                                  | grep test4 --> stdout
                                                  | grep test5 --> stdout

当tee使用文件时请不要发送给我bash / tee / $ ...命令,并且bash太复杂而无法理解......

请注意,订单并不关心,第一个已完成的链也将被处理。

2 个答案:

答案 0 :(得分:0)

你可能应该把你正在做的事情分解成多个较小的任务,而不是试图在一击中粉碎一切。这是一个BASH脚本,可以执行您想要的相同操作,但更容易理解。

注意:我没有对此进行测试,因此可能存在问题。

#!/bin/bash

FILENAME='/tmp/test.log'
TMPNAME='mktemp -t' || exit

wc -l $FILENAME
grep 'test1' $FILENAME
awk '/test2/ && /test3/ {print}' $FILENAME > $TMPNAME
grep 'test4' $TMPNAME
grep 'test5' $TMPNAME

rm $TMPNAME

答案 1 :(得分:0)

我实际上必须为学校项目开发类似的东西。我的想法是概括管道的概念,以达到这样的目的:

 process1  --> process2
           --> process3 --> stdout
           --> process4 --> process5 --> stdout
                        --> process6 --> stdout

(也可以循环)

为了做到这一点,我的程序做了以下事情:

  • 解析包含管道图(进程和管道)的文件
  • 使用fork()创建子进程
  • 对于每个子进程,我关闭传入管道的写入结束,我关闭传出管道的读取端,我调用execl()。其余的由子进程处理(小心死锁!),具体取决于你想要实现的目标。

在我的情况下,由于调用的进程也是由我开发的,我可以将管道文件描述符作为参数传递给子进程(--pipe-in​​ .... --pipe-out .... ),但由于您使用的是基于stdin / stdout的现有程序,您可以使用dup2()来“复制”标准I / O管道。

我不知道你是否打算这样做,但这样做是可行的。