Выбор ответа Senior Потоки и пайпы обновлено
Почему yes | head -1 завершается
Вопрос
Команда yes пишет бесконечно. Почему yes | head -n 1 завершается сразу?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Запись в закрытый пайп даёт yes SIGPIPE, и он завершается. Когда последний читатель пайпа закрыл его, запись в пайп вызывает SIGPIPE, действие по умолчанию которого завершение. head никого не убивает, shell тоже не рассылает сигналы остальным частям.
Варианты ответа
headпосле первой строки посылаетyesсигнал SIGTERM- Shell видит выход последней команды и убивает остальные
- Буфер пайпа переполняется, и ядро убивает
yesпо OOM - Запись в закрытый пайп даёт
yesSIGPIPE, и он завершаетсяправильный ответ
Разбор
Когда последний читатель пайпа закрыл его, запись в пайп вызывает SIGPIPE, действие по умолчанию которого завершение. head никого не убивает, shell тоже не рассылает сигналы остальным частям. При переполнении буфера писатель просто блокируется, OOM здесь нет. Отсюда же сообщения Broken pipe в логах при раннем закрытии читателя.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.