Tubulação mútua no linux

4

Gostaria que a saída de A fosse inserida para B e, ao mesmo tempo, a saída de B fosse a entrada para A , isso é possível?

Eu tentei a coisa ingênua: criar pipes nomeados para A ( pipeA ) e B ( pipeB ) e, em seguida:

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

Mas isso não funciona ( pipeB está vazio e mudar a ordem também não ajudaria).

Qualquer ajuda seria apreciada.

Exemplo:

O comando A pode ser compilado deste programa em C:

#include <stdio.h>

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

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

O comando B pode ser compilado deste programa em C:

#include <stdio.h>

int main()
{    
    int x = 0;
    while (scanf("%d", &x) != EOF)
    {
        printf("%d\n", x + x);
    }
    return 0;
}
    
por user21919 20.11.2012 / 13:35

2 respostas

2

I would like the output of A to be input for B and at the same time the output of B to be the input for A, is that possible?

Eu não vejo como isso poderia funcionar.

Se ambos os processos dependem um do outro para gerar a saída, o processo B irá esperar até que o processo A produza alguma saída, mas o processo A não gerará nenhuma saída até receber entrada do processo B.

Ambos os processos bloqueariam para sempre.

EDITAR :

O OP comentou abaixo um caso diferente no qual um processo A gera alguma saída e então espera pela entrada para o processo B, enquanto o processo B simplesmente espera pelo processo A.

Nesse caso, podemos usar "tubulação mútua" para funcionar. Crie dois scripts:

/tmp/multualpipingA (este script gera alguma saída com echo process A e aguarda):

#!/bin/bash

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

e /tmp/multualpipingB (este script só reage à entrada):

#!/bin/bash

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

Agora abra duas sessões de terminal, "1" e "2" e digite nesta ordem:

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

Você verá esta saída:

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

e isso:

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"""""

(testado no OS X 10.8.2 "Montain Lion")

    
por 20.11.2012 / 15:19
2

Tente fazer isso se tiver bash :

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

Ele é chamado de substituição do processo

Exemplo de vida real © ® ™:

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

Veja o link ou o link para um uso comum.

    
por 20.11.2012 / 13:39

Tags