Как конвейер знает, когда останавливать

Некоторые программы могут иметь бесконечное время выполнения и производить бесконечный вывод. Когда используется в трубе с завершенной командой, как трубопровод знает, когда остановиться?

Например, возьмите yes (бесконечный вывод) с помощью head :

  yes | head -n 5 

Это даст всего 5 лет.

Является ли первая команда завершающей, которая останавливает другие процессы ввода / вывода?
Как это работает ?

  • Цикл через двоичные фрагменты данных из stdin в Bash
  • sox между двумя трубами
  • Безопасно читать пароль из замещения процесса?
  • Как сохранить трубку (|) в переменной?
  • Перенаправление и вывод труб
  • Выход трубопровода между двумя одновременными независимыми программами
  • Завершите текстовый поиск меньше (1) и продолжайте читать через канал Unix
  • Bash названная труба - Atomic Reading
  • One Solution collect form web for “Как конвейер знает, когда останавливать”

    Команды связаны с трубой (я говорю здесь о примитиве системы – очевидно, они связаны с | ). Когда прочитанный конец трубы ( stdin head ) становится close d (== когда head либо явно ( close ), либо неявно (выход) закрывает ее), попытки записи в конец записи ( stdout of yes ) не удастся.

    По умолчанию это не просто обычный сбой errno , но и сбой, который приводит к тому, что процесс записи получает сигнал SIGPIPE . Действие обработчика по умолчанию для сигнала SIGPIPE прекращается.

    Короче говоря, если вы напишете разбитую трубу, система отправит вам SIGPIPE и по умолчанию SIGPIPE убьет вас. Вот почему yes заканчивается, когда head закончилась (и тем самым сломала трубу).


    Если вы проигнорируете SIGPIPE в родительской оболочке, тогда команды наследуют это расположение, а write в разбитый трубу просто вызовет ошибку errno EPIPE . Как представляется, yes строчит эту ошибку, и печатает ее:

     $ (trap "" SIGPIPE; yes | head -n 5) y y y y yes: standard output: Broken pipe yes: write error 
    Interesting Posts

    Поиск и замена Perl записывает каждый файл

    группы захвата sed не работают

    Какие значения return / exit можно использовать в bash-функциях / скриптах?

    Создание отчета об использовании ресурса отчета для дочерних процессов

    Использовать параметр в аргументе команды

    изменить язык в скрипте

    Можно ли использовать dd для быстрого восстановления зеркального диска ZFS?

    Не удается получить доступ к доступному порталу во FreeBSD 12-CURRENT

    Как предотвратить ядро ​​от поворота и перезаписи исходной файловой системы?

    Не удается установить / обновить пакеты на вновь установленном CentOS

    Может ли кто-нибудь изменить содержимое файла с разрешением 777 на сервере?

    Существует ли максимальное расширение имени файла bash (globbing), и если да, то что это такое?

    Удалите строки между двумя тегами (с некоторыми ограничениями)

    Как подключиться к ssh-серверу, запущенному на встроенном Linux, без / etc / passwd?

    что это означает по адресу электронной почты в качестве метки генерирования лобковой / частной пары ключей rsa?

    Linux и Unix - лучшая ОС в мире.