Linux 上的相互管道

Linux 上的相互管道

我希望 的输出A作为 的输入B,同时 的输出B作为 的输入A,可以吗?

我尝试了一个简单粗暴的方法:为A( pipeA) 和B( pipeB) 创建命名管道,然后:

pipeB | A | pipeA &
pipeA | B | pipeB &

但这不起作用(pipeB是空的并且切换顺序也无济于事)。

任何帮助,将不胜感激。

例子:

命令A可以是该 C 程序的编译形式:

#include <stdio.h>

int main()
{
    printf("0\n");

    int x = 0;
    while (scanf("%d", &x) != EOF)
    {
        printf("%d\n", x + 1);
    }
    return 0;
}

命令B可以是该 C 程序的编译形式:

#include <stdio.h>

int main()
{    
    int x = 0;
    while (scanf("%d", &x) != EOF)
    {
        printf("%d\n", x + x);
    }
    return 0;
}

答案1

我希望 A 的输出作为 B 的输入,同时 B 的输出作为 A 的输入,可以吗?

我不明白这是怎么可能的。

如果两个过程互相依赖为了生成输出,进程 B 将等待直到进程 A 产生一些输出,但是进程 A 直到获得来自进程 B 的输入才会生成任何输出。

两个进程都会永远阻塞。

编辑

OP 在下面评论了一个不同的情况,其中进程 A 生成一些输出,然后等待进程 B 的输入,而进程 B 只是等待进程 A。

在这种情况下,我们可以使“相互管道”发挥作用。创建两个脚本:

/tmp/multualpipingA(该脚本生成一些输出echo process A并等待):

#!/bin/bash

echo process A
while read; do
    echo process A says: \"$REPLY\"
    sleep 1
done < /dev/stdin

并且/tmp/multualpipingB(该脚本仅对输入做出反应):

#!/bin/bash

while read; do
    echo process B says: \"$REPLY\"
    sleep 1
done < /dev/stdin

现在打开两个终端会话“1”和“2”,并按以下顺序输入:

session1$ mkfifo /tmp/fifo{A,B}

session1$ cat /tmp/fifoB | /tmp/multualpipingB | tee /tmp/fifoA Enter

session2$ cat /tmp/fifoA | /tmp/multualpipingA | tee /tmp/fifoB Enter

您将看到以下输出:

process A
process A says: "process B says: "process A""
process A says: "process B says: "process A says: "process B says: "process A""""

和这个:

process B says: "process A"
process B says: "process A says: "process B says: "process A"""
process B says: "process A says: "process B says: "process A says: "process B says: "process A"""""

(在 OS X 10.8.2 “Montain Lion” 上测试)

答案2

如果您有以下情况,请尝试这样做

command | tee >(command1) | tee >(command2)

它的名字是流程替代

现实生活©®™示例:

$ echo foobar | tee >(grep -o "f") | tee >(grep -o "r")
foobar
r
f
$ 

http://mywiki.wooledge.org/ProcessSubstitution或者http://mywiki.wooledge.org/BashFAQ/024供共同使用。

相关内容