Настройка чтения конвейеров из именованных каналов без блокировки в bash - PullRequest
7 голосов
/ 07 октября 2008

Я пытаюсь вызвать подпроцесс с дескриптором файла, открытым для данного канала, чтобы вызов open () не зависал, ожидая, пока другая сторона канала получит соединение.

Для демонстрации:

$ mkfifo /tmp/foobar.pipe
$ some_program --command-fd=5 5</tmp/foobar.pipe

В этом случае some_program не будет запущен, пока какой-либо процесс не откроет /tmp/foobar.pipe для записи; однако, some_program имеет полезные эффекты, даже когда он не получает команды, поэтому желаемое поведение для немедленного выполнения some_program.

Механизмы, позволяющие сделать это с помощью альтернативного языка сценариев (python, perl и т. Д.) Или оболочки C, открывающей /tmp/foobar.pipe с флагом O_NONBLOCK, очевидны; Я ищу решение для чистого bash, если это возможно.

Ответы [ 2 ]

9 голосов
/ 07 октября 2008

Открытие FD для чтения / записи, а не только для чтения, при настройке конвейера предотвращает блокировку.

Чтобы быть более конкретным:

$ mkfifo /tmp/foobar.pipe
$ some_program --command-fd=5 5<>/tmp/foobar.pipe

предотвращает нежелательное поведение блокировки, так как 5<>/tmp/foobar.pipe открывается в режиме RW (в отличие от открытия в режиме только для чтения, как при 5</tmp/foobar.pipe), хотя O_NONBLOCK все еще установлен. Спасибо Waldner на irc: //irc.freenode.org/#bash за этот указатель.

3 голосов
/ 07 октября 2008

Единственный способ получить такой результат - это взлом:

mkfifo /tmp/foobar.in
mkfifo /tmp/foobar.out
( cat </tmp/foobar.in ) >/tmp/foobar.out &
some_program --command-fd=5 5</tmp/foobar.out

возможно, это поможет: -)

...