bash pipe - если первый исполняемый файл завершится, выйдут ли все последующие исполняемые файлы? - PullRequest
2 голосов
/ 10 февраля 2020

Если у меня есть произвольное количество трубных источников и приемников

exec1 | exec2 | exec3 | ...

ВОПРОС

  1. Тогда если execN выход, все ли execM вниз по течению (M> N) также завершатся?
  2. Что будет с теми, кто вверх по течению (M

1 Ответ

6 голосов
/ 10 февраля 2020

Последующие процессы не обязательно завершатся. Когда execN выходит, он закрывает конец записи канала, который закрывает конец чтения стандартного ввода execN+1. Но пока execN+1 не попытается прочитать из стандартного ввода, он не заметит, и даже тогда он просто обнаружит, что достиг конца файла; он может продолжить делать другие вещи или выйти, как он решит.

В восходящем направлении, execN-1 не заметит, что execN вышел и закрыл свой конец чтения канала, пока execN-1 не попытается выполнить запись в его конец канала, после чего он получит сигнал SIGPIPE. Обработчик по умолчанию для этого сигнала - выход, но execN-1 может установить свой собственный обработчик, чтобы решить, когда и когда возникнет такая ситуация.

...