Comunicação mútua bidirecional de programas separados

2

Eu tenho 3 programas diferentes que eu gostaria de intercomunicar um com o outro.

Eu tenho um mecanismo que precisa se comunicar com 2 bots e os bots com o mecanismo. O mecanismo é escrito em C ++ e os bots podem ser escritos em qualquer idioma. O mecanismo grava a saída para stdout e os dois bots precisam ler a saída. Dependendo da saída do motor, um dos bots escreverá uma resposta ao stdout (é um jogo baseado em turnos). Aqui está diagrama bruto tentando ilustrar o que quero dizer.

Minhaabordagematualécomoaseguinte:

mkfifofifo0fifo1fifo2./engine|teefifo1fifo2<fifo0&./bot1>fifo0<fifo1&./bot2>fifo0<fifo2

Euleio este postar na E / S circular, o que sugere usar tail e tee, mas não tenho certeza de como fazer isso funcionar com meus requisitos. É possível fazer isso com tubos? Como isso seria feito com tubos?

    
por tyrvi 04.07.2017 / 03:46

1 resposta

2

Você tem o < fifo0 no lugar errado. Você quer que seja stdin de engine , não tee :

mkfifo fifo0 fifo1 fifo2
< fifo0 ./engine | tee fifo1 fifo2 &
./bot1 > fifo0 < fifo1 &
./bot2 > fifo0 < fifo2

Note que muitos utilitários começam a armazenar em buffer sua saída quando ela não vai para um dispositivo tty (aqui um pipe (ou possivelmente um par de soquetes se o shell for ksh93)). Nos sistemas GNU e FreeBSD, você pode tentar usar o comando stdbuf para desabilitar esse buffer:

mkfifo fifo0 fifo1 fifo2
< fifo0 stdbuf -o0 ./engine | tee fifo1 fifo2 &
stdbuf -o0 ./bot1 > fifo0 < fifo1 &
stdbuf -o0 ./bot2 > fifo0 < fifo2
    
por 04.07.2017 / 10:45