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

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

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

  yes | head -n 5 

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

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

  • Содержимое конвейера с несколькими пробелами
  • Объединить входные данные из нескольких файлов / труб без сбивающих линий или блокировки?
  • как использовать только определенные адреса в подсети для traceroute?
  • Почему именованный канал не удаляется после перезапуска системы?
  • Что происходит, когда перенаправление и перенаправление ввода выполняется по команде
  • Можно ли трубить в dirsplit?
  • Почему не выводятся политики политики apt-cache?
  • В чем смысл опций cut -d и -f
  • 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
    Linux и Unix - лучшая ОС в мире.