чтение не задерживается при чтении из канала в bash - PullRequest
11 голосов
/ 23 июня 2011

Я создаю канал, используя

mkfifo /tmp/foo.pipe

Теперь я хочу попробовать прочитать из канала максимум 2 секунды, поэтому я выполняю

read -t 2 line < /tmp/foo.pipe

Время ожидания непроисходят.Чтение просто сидит там, ожидая ввода из трубы.

В руководствах говорится, что read должен работать с именованными каналами.У кого-нибудь есть идея, почему это происходит?

ls -al /tmp/foo.pipe
prw-r----- 1 foo bar 0 Jun 22 19:06 /tmp/foo.pipe

Ответы [ 4 ]

18 голосов
/ 23 июня 2011

Ваша оболочка блокирует вызов open () перед вызовом встроенного чтения.

В Linux вы можете открыть FIFO для чтения и записи одновременно, чтобы предотвратить блокировку при открытии;это непереносимо, но может делать то, что вы хотите.

read -t 2 <>/tmp/foo.pipe

Адаптировано из: Скрипт Bash с неблокирующим чтением

1 голос
/ 08 ноября 2012

Если вы просто хотите сбросить (и удалить) данные из FIFO:

dd iflag=nonblock if=/tmp/foo.pipe of=/dev/null &> /dev/null
0 голосов
/ 20 октября 2011
TMOUT=2
read line < /tmp/foo.pipe
0 голосов
/ 23 июня 2011

Ваша оболочка - та, которая удерживает ее, она пытается прочитать из канала, чтобы передать данные в команду чтения, и, поскольку она ничего не получает, она просто сидит и ждет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...