问题描述
一个进程从多个进程读取fifo以获得指令。
(1)阅读器bash脚本:
while read LINE < 'MY_FIFO'
do
# process line
done
(许多)作家bash脚本:
while [ 1 ]
do
INSTRUCTION = # get an instruction
echo $INSTRUCTION > 'MY_FIFO'
done
当我们有1位作家或作家不同时写作时,此方法可以很好地将指令传递给读者。但是,如果我们有很多作家同时写作,那么读者就会从最早写入FIFO的那个人那里得到第一条消息,然后挂起等待输入,而不是获取下一条指令。
在幕后发生了什么,使我无法让多个作者写同一张fifo? 他们会覆盖彼此的指令吗?
在写fifo之前,有没有办法让我测试读者是否已准备好从fifo进行读取?
解决方法
一个问题是,当编写者编写其消息时,它将关闭管道,然后您的阅读器将退出该循环。当多个进程同时写入时,管道中还会出现乱码消息。
您可以尝试以下方法。在写入管道时,它使用stream.replaceTracks
来锁定管道:
阅读器
flock
writers -请注意,这首先打开管道,然后等待锁定成功,最后写入消息:
#!/bin/bash
while [[ 1 ]]
do
IFS= read -r LINE < MY_FIFO
echo reader got "$LINE"
done
可选的 writers -创建一个锁文件,直到实际持有该锁时才打开fifo。
#!/bin/bash
# getting instructions from stdin for demo purposes
while IFS= read -r INSTRUCTION
do
echo Sending "$INSTRUCTION"
# advisory lock of the pipe when writing
flock MY_FIFO echo "$INSTRUCTION" > MY_FIFO
done