Процес отримує 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.