一个 READER 的 FIFO 和 BASH/SH 中的多个 WRITER

FIFO with one READER and multiple WRITER in BASH/SH

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

一个进程读取多个进程的fifo获取指令。

(1) reader bash 脚本:

while read LINE < 'MY_FIFO'
do
 # process line
done

(很多)作家 bash 剧本:

while [ 1 ]
do
  INSTRUCTION = # get an instruction
  echo $INSTRUCTION > 'MY_FIFO'
done

当我们有 1 个写入器或写入器不同时写入时,这可以很好地向 reader 传递指令。但是如果我们同时有很多写入者,reader 会从第一个写入 FIFO 的人那里获取第一条消息,然后挂起等待输入而不是获取下一条指令。

阻止我让多个写入器写入同一个 fifo 的幕后发生了什么? 他们是否会覆盖彼此的指令?

有没有办法让我在写入 fifo 之前测试 reader 是否准备好从 fifo 读取?

一个问题是,当作者写完消息后,它会关闭管道,然后您的 reader 将退出该循环。当多个进程同时写入时,您还会在管道中收到乱码消息。

你可以试试这个。它在写入管道时使用 flock 锁定管道:

reader

#!/bin/bash

while [[ 1 ]]
do
    IFS= read -r LINE < MY_FIFO
    echo reader got "$LINE"
done

writers - 注意这里先打开管道,然后等待加锁成功,最后写入消息:

#!/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

可选 writers - 这将创建一个锁文件并且在实际持有锁之前不会打开 fifo。

#!/bin/bash

while IFS= read -r INSTRUCTION
do
    echo Sending "$INSTRUCTION"
    {
         flock 9
         echo "$INSTRUCTION" > MY_FIFO
    } 9> MY_FIFO.lck
done