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 find
kontynuować działania po head
zakończeniu (a następnie zamknięciu jedynego deskryptora pliku otwartego do odczytu na tym potoku).
yes
Komenda 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 yes
otrzyma SIGPIPE.
Powyżej, większość powłok użyć pipe(2)
podczas ksh93
uż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 EPIPE
błę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.