FIFO,在BASH / SH中带有一个READER和多个WRITER

问题描述

我有一个命名管道(FIFO)说:'MY_FIFO'

一个进程从多个进程读取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