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

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

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

  yes | head -n 5 

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

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

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 
  • Cygwin - хвост останавливает чтение входной трубы после первой записи
  • Могу ли я подключать stdout на одном сервере к stdin на другом сервере?
  • Читаемые комментарии по отдельным строкам в многострочной команде bash с конвейерами?
  • Что делает процесс Unix умирать с Broken pipe?
  • readarray (или труба)
  • Bash: не может вырваться из цикла «while read»; технологические замещения
  • Как обрабатывать / выводить TCPDUMP-файлы в реальном времени
  • Как фиксировать статус выхода команды без конечного результата в конвейере?
  • cat SQL-файлы и перейти к схеме импорта
  • Командная строка SQLite: как вы подключаете вывод к утилите UNIX?
  • less: переход к концу как можно большего количества буфера, а не фактического конца буфера
  • Довольно сложный cmd
  • Linux и Unix - лучшая ОС в мире.