как труба оболочки обрабатывает бесконечный цикл - PullRequest
4 голосов
/ 27 июля 2011

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

cat file_with_long_content | less

, который прекрасно работает, но мне интересно, что менее работает, даже если вывод никогда не заканчивается, подумайте о следующем скрипте в файле inf.sh:

while true; do date; done

тогда я бегу

sh inf.sh | less

И он по-прежнему может разбивать результаты на страницы, поэтому правильно ли говорить, что конвейер передает поток, а не ожидает завершения команды перед выводом результата?

Ответы [ 3 ]

7 голосов
/ 27 июля 2011

Да, когда вы запускаете sh inf.sh | less, две команды запускаются параллельно. Данные, записанные в канал первым процессом, буферизируются (ядром) до тех пор, пока они не будут прочитаны вторым. Если буфер заполнен (т. Е. Если первая команда записывает в канал быстрее, чем вторая может прочитать), то следующая операция записи будет заблокирована, пока не будет доступно дополнительное пространство. Аналогичное условие возникает при чтении из пустого канала: если буфер канала пуст, но входной конец все еще открыт, чтение заблокирует дополнительные данные.

Подробнее см. Руководство по трубе (7) .

1 голос
/ 27 июля 2011

Есть также информативная статья Александра Сандлера под названием «Как меньше обрабатывает свой ввод»!

См .: Время, затраченное командой `less` для отображения вывода

1 голос
/ 27 июля 2011

Это правильно. Трубы ручьи .

Вы можете закодировать свою собственную версию инструмента less в несколько строк кода C. Потратьте время, чтобы сделать это, включая краткое исследование файлов и каналов, и у вас появится понимание, чтобы ответить на ваш собственный вопрос и многое другое:).

...