Как узнать, ожидает ли процесс на стандартном вводе? - PullRequest
0 голосов
/ 08 октября 2018

Вот последовательность команд оболочки с комментариями

#cd `mktemp -d`
mkfifo i
exec 3<>i                   # keep pipe open
bash <i &                   # run bash interpreter in background, use -x option to see what and when is executed 
echo 'echo X' >i            # writes X immediately
echo 'if echo -n A; then' >i   # waits for input till end of if-statement
echo 'echo B; fi' >i        # writes AB
echo 'echo C; sleep 7; echo D' >i   # does not wait on stdin while sleep
echo 'exit' >i              # also kill $(jobs -p)

Необходимо определить, ожидает ли подпроцесс ввода или обрабатывает что-то.

Может быть except поможет?

1 Ответ

0 голосов
/ 09 октября 2018

Поведение такое же, как в интерактивном терминале.Просто попробуйте:

you@yourpc ~ sleep 3<enter>
ls<enter>
wait...
you@yourpc ~ ls<inserted by bash>
file1 file2 file3 ...

Поведение канала в Linux описано в разделе man 7 pipe

Ввод / вывод для каналов и FIFO

...

Если процесс пытается прочитать из пустого канала, чтение (2) блокируется, пока данные не станут доступны.Если процесс пытается выполнить запись в полный канал (см. Ниже), записывайте (2) блоки до тех пор, пока из канала не будет считано достаточное количество данных для завершения записи.

...

Емкость трубы

Емкость трубы ограничена.Если канал заполнен, запись (2) заблокируется или завершится неудачно, в зависимости от того, установлен ли флаг O_NON-BLOCK (см. Ниже).Разные реализации имеют разные пределы для пропускной способности трубы.Приложения не должны полагаться на определенную емкость: приложение должно быть спроектировано так, чтобы процесс чтения потреблял данные, как только он стал доступен, чтобы процесс записи не оставался заблокированным.

Это означает, чтоконец записи fifo не содержит информации о том, когда читатель прочитал или обработал ввод.

...