io redirecionamento para "cross" 2 programas

3

Como "cruzar" stdin e stdout de dois programas? Especificamente, eu tenho 2 programas chamam pgm1 e pgm2 , eles são jogos interativos de jogo da velha. Ambos emitem um número (0 a 8) indicando a posição onde deseja marcar e espera outro número (0 a 8) indicando onde o usuário deseja marcar. A diferença entre os dois é pgm1 faz o primeiro movimento e pgm2 faz o segundo movimento. Ambos funcionam bem via usuário interativo. Eles podem ser feitos para jogar uns contra os outros usando o redirecionamento de io?

Eu tentei as seguintes coisas em vão:

  1. Abra pgm2 em um terminal separado (aguarde a entrada), encontre o pid. Em seguida, execute pgm1 em outro terminal ./pgm1 < /proc/pid_pgm2/fd/1 > /proc/pid_pgm2/fd/0
  2. Criamos 2 canais usando o mkfifo, digamos pipe1 e pipe2 , e executamos o seguinte em dois terminais diferentes: ./pgm1 < pipe1 > pipe2 e ./pgm2 < pipe2 > pipe1
  3. tentei os dois acima, executando pgm1 antes de pgm2, executando pgm2 antes de pgm1
    Certifiquei-me de usar fflush(stdout) em ambos os programas, imediatamente após usar printf() .

Alguém poderia me dizer o que eu estou perdendo / ou dando errado / ou isso é possível?

    
por kumar 27.09.2013 / 10:45

2 respostas

3

Você deve conseguir que isso funcione com um FIFO e um pipe.

$ mkfifo fifo
$ ./pgm2 < fifo | ./pgm1 > fifo

A entrada do programa dois é o fifo e as saídas para o pipe. Programa de entrada é o tubo e saídas para o fifo.

Esteja avisado: isto é muito atrevido em geral, e pode travar se o "ping / pong" entre os processos não for perfeito.

Veja também esta pergunta do Stack Overflow: Como redirecionar o stdout do 2º processo de volta para o stdin do 1º processo?

    
por 27.09.2013 / 11:14
2

Você tem um impasse: ./pgm1 < pipe1 > pipe2 e ./pgm2 < pipe2 > pipe1

O open("pipe1", O_RDONLY) feito pelo shell antes da execução de pgm1 será bloqueado até que algo mais seja escrito open nesse mesmo canal. Até que isso seja feito, não fará o próximo open("pipe2", O_WRONLY) .

O mesmo para o outro. O open("pipe2", O_RDONLY) será bloqueado e, como o open("pipe2", O_WRONLY) não será feito, pois o outro shell está aguardando por um gravador em pipe1 , você tem um impasse.

Se você tivesse escrito

pgm1 < pipe1 > pipe2 & pgm2 > pipe1 < pipe2

Teria funcionado.

No Linux, você também pode escrever:

{ pgm1 <&3 3<&- | pgm2 3<&-; } 3< /dev/fd/1 | :
    
por 27.09.2013 / 14:05