独立プログラムのための多対一通信

独立プログラムのための多対一通信

私は3つの異なるプログラムを持っていますが、互いにコミュニケーションできることを願っています。

2つのロボットと、ロボットがエンジンと通信する必要があるエンジンがあります。エンジンはC ++で書かれており、ロボットは任意の言語で書くことができます。エンジンは出力を標準出力に記録し、両方のロボットが出力を読み取る必要があります。エンジンの出力に応じて、ボットの1つが標準出力への応答を作成します(これはターンベースのゲームです)。以下は、私が意味するものを説明するためのおおよその図です。 ここに画像の説明を入力してください。

私の現在のアプローチは次のとおりです。

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

私は読んだこれCircular I / Oに投稿された記事でtailとteeを使用することが提案されましたが、私の要件にどのように適合するのかわかりません。パイプを使用してこれを実行できますか?これを達成するためにパイプを使用するとどうなりますか?

ベストアンサー1

あなたは< fifo0それを間違って置いた。 stdinengineではなくstdinになりたいですtee

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

おすすめ記事