redirecionamento io para "cruzar" 2 programas

redirecionamento io para "cruzar" 2 programas

Como “cruzar” stdine stdoutde dois programas? Especificamente, tenho 2 programas chamados pgm1e pgm2, eles são jogos interativos de jogo da velha. Ambos geram um número (0to8) indicando a posição onde deseja marcar e esperam outro número (0to8) indicando onde o usuário deseja marcar. A diferença entre os dois é pgm1fazer o primeiro movimento e pgm2fazer o segundo movimento. Ambos funcionam bem através do usuário interativo. Eles podem jogar uns contra os outros usando o redirecionamento io?

Eu tentei as seguintes coisas em vão:

  1. Abra pgm2em um terminal separado (aguarda entrada), encontre seu pid. Então execute pgm1em outro terminal ./pgm1 < /proc/pid_pgm2/fd/1 > /proc/pid_pgm2/fd/0
  2. Fiz 2 pipes usando mkfifo, digamos pipe1e pipe2e executei o seguinte em dois terminais diferentes: ./pgm1 < pipe1 > pipe2e./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 estou perdendo/ou está errado/ou isso é possível?

Responder1

Você deve conseguir fazer isso funcionar com um FIFO e um tubo.

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

A entrada do programa dois é o fifo e a saída é o pipe. A entrada do programa é o pipe e a saída é o fifo.

Porém, esteja avisado: isso é 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 segundo processo de volta para o stdin do primeiro processo?

Responder2

Você tem um impasse no seu: ./pgm1 < pipe1 > pipe2e./pgm2 < pipe2 > pipe1

O open("pipe1", O_RDONLY)feito pelo shell antes da execução pgm1será bloqueado até que outra coisa faça uma gravação openno mesmo canal. Até que isso seja feito, não acontecerá o próximo open("pipe2", O_WRONLY).

O mesmo para o outro. O open("pipe2", O_RDONLY)will será bloqueado e como o open("pipe2", O_WRONLY)will não será executado, já que o outro shell está aguardando um gravador ativado pipe1, você terá um impasse.

Você tinha 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 | :

informação relacionada