1

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

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

请不要在 tee 处理文件时将我发送到 bash/tee/$... 命令,而 bash 太复杂而无法理解...

请注意,顺序无关紧要,完成的第一个链也将被处理。

4

2 回答 2

0

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

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

(循环也是可能的)

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

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

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

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

于 2011-11-13T15:27:27.923 回答
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
于 2011-08-01T20:23:05.600 回答