Подтвердить что ты не робот

Почему эта труба прекращена?

Это команда, предназначенная для генерации 10 символов в случайном порядке:

cat /dev/urandom | base64 | head -c 10

Мой вопрос cat /dev/urandom | base64 - бесконечный поток вывода, который не остановится сам по себе. Но почему добавление head -c 10 завершает работу всей трубы? Я предполагаю, что cat, base64 и head являются 3 отдельными процессами, как head завершает cat?

4b9b3361

Ответ 1

После base64 выводит 10 байт, head получает достаточное количество входов и выходов. Когда первый пытается вывести больше байтов, он получит сигнал SIGPIPE и, следовательно, выйдет тоже. По той же причине cat выйдет из очереди.

Ответ 2

head закрывает входной файл после прочтения требуемой суммы. когда труба закрыта с одной стороны, другая сторона получает ошибки записи; это приводит к закрытию base64, что в свою очередь вызывает закрытие cat.

Ответ 3

Трубопровод работает путем соединения выхода одного процесса A с входом B. Соединение может быть нарушено, когда

  • A закрывает свой вывод. B получит EOF.
  • B закрывает ввод. A получит сообщение об ошибке, что вывод больше не доступен, когда он пытается записать следующий байт.

Поскольку эти два случая настолько распространены, обработка была перенесена в стандартную библиотеку C.