我有两个进程和一个命名管道。
一个进程主动从管道中读取数据,另一个进程不断向管道发送数据。
发送到管道的命令如下:
sudo iotop -b -P > diskfifo
另一方面,阅读器只是在管道上执行循环读取操作
pipe=./diskfifo
while read line <$pipe
do
if [[ "$line" == 'quit' ]]; then
break
fi
echo $line
done
问题:iotop 命令有时会在一定次数的迭代后停止,我不明白为什么。
但是,我注意到,如果减少发送的数据量,iotop 命令不会停止。
答案1
在循环的每次迭代中,read
都会打开管道进行读取,读取一行数据,然后关闭它。
如果决定在没有主动读取管道的iotop
情况下尝试写入管道,它会收到一个信号,因为它尝试写入没有人正在读取的管道。收到信号后的默认操作是终止进程。read
PIPE
PIPE
不要打开和关闭管道以在循环中进行读取(并希望iotop
在不读取管道时不会写入管道),而是将输入从管道重定向到循环本身:
pipe=./diskfifo
while read word; do
[ "$word" = 'quit' ] && break
printf '%s\n' "$word"
done <"$pipe"
这将使管道在整个循环期间保持打开状态。每次调用read
都会从连接到管道的循环的标准输入继承其标准输入流。
循环的可能的其他表述:
while read word && [ "$word" != 'quit' ]; do
printf '%s\n' "$word"
done <"$pipe"