Добрый день. По какой причине сообщение может не доходить до получателя?
Как воспроизвести.
Выполняем в окне терминала
mkfifo mypipe
exec 3<>mypipe
while read -rt3 ss; do echo "${ss}"; done < <(cat mypipe)
в соседнем окне поочерёдно вводим что-то вроде такого (нужно успеть вводить в течение 3 секунд)
echo 'as1' >mypipe
echo 'as2' >mypipe
echo 'as1' >mypipe
echo 'as2' >mypipe
echo 'as1' >mypipe
echo 'as2' >mypipe
получаем
as1
as2
as1
as1
as2
или
as1
as1
as2
as1
as2
или не получаем, это работает не каждый раз.
Также, видимо, есть период во время которого цикл кончается и сообщения уходят вникуда. После него все отправленные в пайп сообщения прочитаются, если запустить цикл чтения заново.
В интернете говорят, что нельзя узнать степень заполненности трубы нормально, возможно удалось бы что-нибудь отследить. Отправлять ответ, что, мол, получили и прочитали? И если нет, то посылать ещё раз?
Может быть, избавиться от exec? Я пока не могу придумать как. Вот совсем не получается, блокируются и отправитель и получатель.
И, кроме того, в неинтерактивной сессии cat остаётся висеть в памяти вместе со скриптом, мне приходится писать kill cat при завершении, потому что её некому остановить. Как быть с этим? Я не могу закрыть трубу или сделать так, чтобы кошка отвалилась?
Справедливости ради, на практике мне первая проблема не встречалась. Что это, магия интерактивной сессии, или просто сложнее заметить?