Proces otrzymuje SIGPIPE, gdy próbuje zapisać do potoku (nazwanego lub nie) lub gniazda typu SOCK_STREAM, w którym nie ma już czytnika.
To ogólnie pożądane zachowanie. Typowym przykładem jest:
find . | head -n 1
Nie chcesz findkontynuować działania po headzakończeniu (a następnie zamknięciu jedynego deskryptora pliku otwartego do odczytu na tym potoku).
yesKomenda zazwyczaj polega na tym sygnałem do zakończenia.
yes | some-command
Napiszę „y”, dopóki jakieś polecenie się nie zakończy.
Zauważ, że to nie tylko po wyjściu komend, ale także wtedy, gdy wszyscy czytelnicy zamknęli czytanie fd do potoku. W:
yes | ( sleep 1; exec <&-; ps -fC yes)
1 2 1 0
Będzie 1 (podpowłoka), następnie 2 (podpowłoka + uśpienie), następnie 1 (podpowłoka), a następnie 0 odczytanie fd z potoku po tym, jak podpowłoka wyraźnie zamknie swoje standardowe wejście, i wtedy yesotrzyma SIGPIPE.
Powyżej, większość powłok użyć pipe(2)podczas ksh93używa socketpair(2), ale zachowanie jest taka sama w tym względzie.
Gdy proces ignoruje SIGPIPE, wywołanie systemowe piśmie (ogólnie write, ale może być pwrite, send, splice...) wraca z EPIPEbłędem. Tak więc procesy, które chcą ręcznie obsługiwać uszkodzoną rurę, zwykle ignorują SIGPIPE i podejmują działania po błędzie EPIPE.