Выбор ответа Senior Потоки и пайпы обновлено

Почему yes | head -1 завершается

Вопрос

Команда yes пишет бесконечно. Почему yes | head -n 1 завершается сразу?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Запись в закрытый пайп даёт yes SIGPIPE, и он завершается. Когда последний читатель пайпа закрыл его, запись в пайп вызывает SIGPIPE, действие по умолчанию которого завершение. head никого не убивает, shell тоже не рассылает сигналы остальным частям.

Варианты ответа

  1. head после первой строки посылает yes сигнал SIGTERM
  2. Shell видит выход последней команды и убивает остальные
  3. Буфер пайпа переполняется, и ядро убивает yes по OOM
  4. Запись в закрытый пайп даёт yes SIGPIPE, и он завершаетсяправильный ответ

Разбор

Когда последний читатель пайпа закрыл его, запись в пайп вызывает SIGPIPE, действие по умолчанию которого завершение. head никого не убивает, shell тоже не рассылает сигналы остальным частям. При переполнении буфера писатель просто блокируется, OOM здесь нет. Отсюда же сообщения Broken pipe в логах при раннем закрытии читателя.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме