5

У меня есть сценарий ksh, который вызывает:

while read LINE do...

Ввод был перенаправлен (не показан), так что он читает ввод из канала.

Проблема заключается в том, что когда средство записи в канал закрывается, read возвращает значение false и выходит из цикла.

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

Я попытался обернуть всю read LINE в подоболочку и зациклить всю подоболочку, но read просто получает пустую строку после закрытия канала, а не блокирует, пока не будет больше ввода, как это происходит при нормальном запуске сценария.

2 ответа2

5

Канал создается в ядре как метод связи между двумя процессами. Обычно это отношения родителей и детей. Если процесс завершается, канала нет. Нет никакого способа прикрепить другой процесс к другому концу канала в ядре. Ядро автоматически запускает отключение на конвейере и выдает EPIPE всем читателям.

Что вы можете сделать, это создать именованный канал. Он существует в файловой системе и не закрывается при выходе из любой программы записи. Вы даже можете иметь несколько писателей в канал, хотя я бы не советовал этого - «чанки», которые, по вашему мнению, пишутся, пишутся разными чанками из-за буферизации.

Вы создаете канал в известном каталоге с помощью mkfifo /path/to/pipe и перенаправляете stdin или stdout из / в него в зависимости от того, являетесь ли вы читателем или писателем.

0

Когда труба закрыта, ее нельзя открыть заново. Я не знаю всех особенностей именованных каналов в файловой системе, но если вы просто делаете что-то вроде cat somefile.txt | myprogram тогда как только cat закрывает трубу, труба ушла.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .