我有3个不同的程序,我想彼此相互通信.
我有一个引擎需要与2个机器人和机器人与引擎通信.引擎用C语言编写,机器人可以用任何语言编写.引擎将输出写入stdout,两个机器人都需要读取输出.根据引擎的输出,其中一个机器人会写一个对stdout的响应(这是一个基于回合的游戏).这是粗略的图表试图说明我的意思.
我目前的做法如下:
mkfifo fifo0 fifo1 fifo2
./engine | tee fifo1 fifo2 < fifo0 &
./bot1 > fifo0 < fifo1 &
./bot2 > fifo0 < fifo2
我在循环I / O上阅读this帖子,建议使用尾部和三通,但我不知道如何按照我的要求进行工作.是否可以用管道做到这一点?怎么用管子做?
解决方法:
你有< fifo0在错误的地方.你希望它是引擎的标准输入,而不是发球台:
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