我有 3 个不同的程序,我希望它们能够相互通信。
我有一个引擎需要与 2 个机器人以及机器人与引擎进行通信。引擎是用 C++ 编写的,机器人可以用任何语言编写。引擎将输出写入标准输出,两个机器人都需要读取输出。根据引擎的输出,其中一个机器人将向标准输出写入响应(这是一款回合制游戏)。这是试图说明我的意思的粗略图表。
我目前的方法如下:
mkfifo fifo0 fifo1 fifo2
./engine | tee fifo1 fifo2 < fifo0 &
./bot1 > fifo0 < fifo1 &
./bot2 > fifo0 < fifo2
我读这发布在圆形 I/O 上,建议使用 tail 和 tee,但我不确定如何使其符合我的要求。可以用管道来做到这一点吗?如果用管道来实现这一点,该怎么办呢?
答案1
你把它< fifo0
放错地方了。你希望它是engine
's stdin,而不是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