私は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