Это конвейеру команды для генерации 10 символов пароля случайным образом:Почему эта труба оканчивается?
cat /dev/urandom | base64 | head -c 10
Мой вопрос cat /dev/urandom | base64
бесконечный выходной поток, который не остановится сам по себе. Но почему добавление head -c 10
приводит к тому, что вся труба заканчивается? Я предполагаю, что cat
, base64
и head
представляют собой 3 отдельных процесса, как может head
прекратить действие cat
?
Возможно, стоит упомянуть, что единственная причина, по которой 'head' получает какой-либо вход, заключается в том, что' base64' записывает выходные данные после того, как получает определенный объем ввода, т. Е. Когда его буфер заполнен. Если бы он читал до EOF, он читал бы навсегда, и «голова» никогда не попала в какую-либо трещину. Таким образом, подобный конвейер, например 'cat/dev/urandom | сумма | head -c 10' будет вести себя по-другому, так как 'sum' ждет EOF. –
s/получает ошибки в записи/получает SIGPIPE/ –
Комментарий Роба * крайне важно. Если процесс наследует обработчик SIGPIPE или игнорирует SIGPIPE (например, если он запущен под старым модулем подпроцессов интерпретаторов python) и не проверяет ошибки записи, он не будет завершен. Существует огромная разница между ошибкой записи и получением SIGPIPE, а программы, которые игнорируют обе проблемы, подвержены бесконечному запуску. –