![redirecionamento io para "cruzar" 2 programas](https://rvso.com/image/50583/redirecionamento%20io%20para%20%22cruzar%22%202%20programas.png)
Como “cruzar” stdin
e stdout
de dois programas? Especificamente, tenho 2 programas chamados pgm1
e 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 é pgm1
fazer o primeiro movimento e pgm2
fazer 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:
- Abra
pgm2
em um terminal separado (aguarda entrada), encontre seu pid. Então executepgm1
em outro terminal./pgm1 < /proc/pid_pgm2/fd/1 > /proc/pid_pgm2/fd/0
- Fiz 2 pipes usando mkfifo, digamos
pipe1
epipe2
e executei o seguinte em dois terminais diferentes:./pgm1 < pipe1 > pipe2
e./pgm2 < pipe2 > pipe1
- tentei os dois acima, executando pgm1 antes de pgm2, executando pgm2 antes de pgm1,
certifiquei-me de usarfflush(stdout)
em ambos os programas, imediatamente após usarprintf()
.
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 > pipe2
e./pgm2 < pipe2 > pipe1
O open("pipe1", O_RDONLY)
feito pelo shell antes da execução pgm1
será bloqueado até que outra coisa faça uma gravação open
no 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 | :