Linux

獨立程序的多對一雙向通信

  • July 4, 2017

我有 3 個不同的程序,我想相互交流。

我有一個引擎需要與 2 個機器人和機器人與引擎進行通信。該引擎是用 C++ 編寫的,機器人可以用任何語言編寫。引擎將輸出寫入標準輸出,兩個機器人都需要讀取輸出。根據引擎的輸出,其中一個機器人將向標準輸出寫入響應(這是一個回合製遊戲)。這是試圖說明我的意思的粗略圖表。 在此處輸入圖像描述

我目前的方法如下:

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

我在循環 I/O 上閱讀了這篇文章,其中建議使用 tail 和 tee,但我不確定如何使其符合我的要求。可以用管道做到這一點嗎?這將如何用管道完成?

< fifo0放錯地方了。你希望它是engine’s 標準輸入,而不是tee’s:

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

請注意,許多實用程序在沒有進入 tty 設備(這裡是管道(或者如果 shell 是 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

引用自:https://unix.stackexchange.com/questions/375107