独立程序的多对一双向通信

独立程序的多对一双向通信

我有 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

相关内容