Процесс неожиданно завершается при отправке в именованный канал

Процесс неожиданно завершается при отправке в именованный канал

У меня есть два процесса и один именованный канал.

Один процесс активно считывает данные из канала, а другой процесс непрерывно отправляет данные в канал.

Команда, отправляемая в канал, следующая:

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"

Связанный контент