相互に通信したい3つの異なるプログラムがあります。
2つのボットと通信する必要のあるエンジンとエンジンを備えたボットがあります。エンジンはC++で記述されており、ボットは任意の言語で記述できます。エンジンは出力をstdoutに書き込み、両方のボットが出力を読み取る必要があります。エンジンからの出力に応じて、ボットの1つがstdoutへの応答を書き込みます(これはターンベースのゲームです)。これが私が何を意味するのかを説明しようとする大まかな図です。
私の現在のアプローチは次のようなものです。
mkfifo fifo0 fifo1 fifo2
./engine | tee fifo1 fifo2 < fifo0 &
./bot1 > fifo0 < fifo1 &
./bot2 > fifo0 < fifo2
私は this テールとティーの使用を提案する円形I/Oの投稿を読みましたが、それを私の要件で機能させる方法がわかりません。パイプでこれを行うことは可能ですか?これはパイプでどのように行われますか?
< 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