"читать" не время выключения при чтении из трубы в bash
Я создаю канал, используя
mkfifo /tmp/foo.pipe
Теперь я хочу попробовать прочитать из канала максимум 2 секунды, поэтому я выполняю
read -t 2 line < /tmp/foo.pipe
Таймаут не возникает. Читайте, просто сидит там, ожидая ввода от трубы.
В руководствах говорится, что "чтение" должно работать с именованными каналами. У кого-нибудь есть идея, почему это происходит?
ls -al /tmp/foo.pipe
prw-r----- 1 foo bar 0 Jun 22 19:06 /tmp/foo.pipe
Ответы
Ответ 1
Ваша оболочка блокирует вызов open() перед вызовом встроенного чтения.
В Linux вы можете открыть FIFO для чтения и записи одновременно, чтобы предотвратить блокировку при открытии; это не переносится, но может делать то, что вы хотите.
read -t 2 <>/tmp/foo.pipe
Адаптировано из: Bash script с неблокируемым чтением
Ответ 2
Если вы просто хотите сбросить (и отбросить) данные из FIFO:
dd iflag=nonblock if=/tmp/foo.pipe of=/dev/null &> /dev/null
Ответ 3
Ваша оболочка - это та, которая держит ее, она пытается прочитать из канала, чтобы подавать данные в команду чтения, и поскольку она не получает ничего, что она просто сидит там, ожидая.
Ответ 4
TMOUT=2
read line < /tmp/foo.pipe