发送到命名管道时进程意外退出

发送到命名管道时进程意外退出

我有两个进程和一个命名管道。

一个进程主动从管道中读取数据,另一个进程不断向管道发送数据。

发送到管道的命令如下:

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情况下尝试写入管道,它会收到一个信号,因为它尝试写入没有人正在读取的管道。收到信号后的默认操作是终止进程。readPIPEPIPE

不要打开和关闭管道以在循环中进行读取(并希望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"

相关内容