Процес отримує SIGPIPE, коли він намагається записати на трубу (названу чи ні) або сокет типу SOCK_STREAM, у якого не залишилося жодного зчитувача.
Це взагалі бажана поведінка. Типовий приклад:
find . | head -n 1
Ви не хочете find
продовжувати працювати, коли head
він закінчується (а потім закриває єдиний дескриптор файлів, відкритий для читання в цій трубці).
yes
Команда , як правило , залежить від цього сигналу припинити.
yes | some-command
Буде писати "y", поки деяка команда не припиниться.
Зауважте, що це не лише тоді, коли команди виходять, це коли всі читачі закрили свій читання fd до труби. В:
yes | ( sleep 1; exec <&-; ps -fC yes)
1 2 1 0
Буде 1 (нижня оболонка), потім 2 (нижня оболонка + сон), потім 1 (нижня оболонка), потім 0 fd зчитування з труби після того, як нижня оболонка явно закриє свій stdin, і ось тоді yes
отримає ПІДПИС.
Вище, більшість оболонок використовувати в pipe(2)
той час як ksh93
використовує socketpair(2)
, але поведінка таке ж в цьому відношенні.
Коли процес ігнорує SIGPIPE, запис системного виклику ( як правило write
, але може бути pwrite
, send
, splice
...) повертається з EPIPE
помилкою. Таким чином, процеси, які хочуть обробити розбиту трубу вручну, зазвичай ігнорують SIGPIPE і вживають заходів при помилці EPIPE.