Bir işlem, okuyucusu olmayan bir boruya (adlandırılmış veya değil) veya SOCK_STREAM tipi bir sokete yazmaya çalıştığında bir SIGPIPE alır.
Genelde istenen davranış. Tipik bir örnek:
find . | head -n 1
Bir find
kere head
sonlandırıldıktan sonra çalışmaya devam etmek istemezsiniz (ve daha sonra bu dosya üzerinde okumak için açık olan tek dosya tanımlayıcısını kapattı).
yes
Komut tipik sonlandırmak için bu sinyalin dayanır.
yes | some-command
Bazı komutlar sona erene kadar "y" yazacaktır.
Sadece komutlar çıktığında değil, tüm okuyucular boruya okumalarını kapattığını unutmayın. İçinde:
yes | ( sleep 1; exec <&-; ps -fC yes)
1 2 1 0
1 (alt kabuk), sonra 2 (alt kabuk + uyku), sonra 1 (alt kabuk) ve sonra alt kabuk kendi stdinini kapattıktan sonra borudan 0 fd okuyacak ve o zaman yes
bir SIGPIPE alacaksınız.
Yukarıda, çoğu kabuk bir pipe(2)
süre ksh93
kullanır socketpair(2)
, ancak davranış bu açıdan aynıdır.
Bir süreç SIGPIPE, yazma sistemi çağrıyı görmezden zaman (genellikle write
fakat olabilir pwrite
, send
, splice
...) bir ile döner EPIPE
hatası. Bu nedenle, kırılmış boruyu manuel olarak ele almak isteyen işlemler tipik olarak SIGPIPE'yi göz ardı eder ve bir EPIPE hatasıyla harekete geçer.