Suatu proses menerima SIGPIPE ketika mencoba untuk menulis ke pipa (bernama atau tidak) atau soket tipe SOCK_STREAM yang tidak memiliki pembaca tersisa.
Itu umumnya perilaku yang diinginkan. Contoh khas adalah:
find . | head -n 1
Anda tidak ingin find
terus berjalan setelah head
diakhiri (dan kemudian tutup satu-satunya deskriptor file yang terbuka untuk dibaca pada pipa itu).
The yes
perintah biasanya bergantung pada sinyal untuk mengakhiri.
yes | some-command
Akan menulis "y" sampai beberapa perintah berakhir.
Perhatikan bahwa bukan hanya ketika perintah keluar, itu ketika semua pembaca telah menutup bacaan fd ke pipa. Di:
yes | ( sleep 1; exec <&-; ps -fC yes)
1 2 1 0
Akan ada 1 (subkulit), kemudian 2 (subkulit + tidur), lalu 1 (subkulit) lalu 0 fd membaca dari pipa setelah subkulit secara eksplisit menutup stdinnya, dan saat itulah yes
akan menerima SIGPIPE.
Di atas, sebagian besar cangkang menggunakan pipe(2)
sementara ksh93
menggunakan a socketpair(2)
, tetapi perilakunya sama dalam hal itu.
Ketika proses mengabaikan SIGPIPE, panggilan sistem penulisan (umumnya write
, tapi bisa pwrite
, send
, splice
...) kembali dengan EPIPE
kesalahan. Jadi proses yang ingin menangani pipa yang rusak secara manual biasanya akan mengabaikan SIGPIPE dan mengambil tindakan atas kesalahan EPIPE.