web-dev-qa-db-ja.com

個別のプログラムの多対1の双方向通信

相互に通信したい3つの異なるプログラムがあります。

2つのボットと通信する必要のあるエンジンとエンジンを備えたボットがあります。エンジンはC++で記述されており、ボットは任意の言語で記述できます。エンジンは出力をstdoutに書き込み、両方のボットが出力を読み取る必要があります。エンジンからの出力に応じて、ボットの1つがstdoutへの応答を書き込みます(これはターンベースのゲームです)。これが私が何を意味するのかを説明しようとする大まかな図です。 enter image description here

私の現在のアプローチは次のようなものです。

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

私は this テールとティーの使用を提案する円形I/Oの投稿を読みましたが、それを私の要件で機能させる方法がわかりません。パイプでこれを行うことは可能ですか?これはパイプでどのように行われますか?

3
tyrvi

< fifo0が間違った場所にあります。 engineではなく、teeのstdinにする必要があります。

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

多くのユーティリティは、ttyデバイス(ここではパイプ(またはシェルがksh93の場合はソケットペア))に送信されないときに出力のバッファリングを開始することに注意してください。 GNUシステムとFreeBSDでは、stdbufコマンドを使用してそのバッファリングを無効にしようとするかもしれません。

mkfifo fifo0 fifo1 fifo2
< fifo0 stdbuf -o0 ./engine | tee fifo1 fifo2 &
stdbuf -o0 ./bot1 > fifo0 < fifo1 &
stdbuf -o0 ./bot2 > fifo0 < fifo2
3