一个 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
我有一个命名管道 (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