กระบวนการได้รับ SIGPIPE เมื่อพยายามเขียนไปที่ไพพ์ (ตั้งชื่อหรือไม่) หรือซ็อกเก็ตประเภท SOCK_STREAM ที่ไม่มีผู้อ่านเหลืออยู่
เป็นพฤติกรรมที่ต้องการโดยทั่วไป ตัวอย่างทั่วไปคือ:
find . | head -n 1
คุณไม่ต้องการfind
ให้ทำงานต่อไปเมื่อhead
ถูกยกเลิก (แล้วปิดไฟล์ descriptor เพียงไฟล์เดียวที่เปิดสำหรับการอ่านบนไพพ์นั้น)
yes
คำสั่งมักจะอาศัยสัญญาณว่าจะยุติ
yes | some-command
จะเขียน "y" จนกว่าคำสั่งบางคำสั่งจะถูกยกเลิก
โปรดทราบว่ามันไม่เพียง แต่เมื่อคำสั่งออกเท่านั้น แต่เมื่อผู้อ่านทั้งหมดปิดการอ่าน fd ไปยังไพพ์ ใน:
yes | ( sleep 1; exec <&-; ps -fC yes)
1 2 1 0
จะมี 1 (subshell) จากนั้น 2 (subshell + sleep) จากนั้น 1 (subshell) จากนั้น 0 fd ที่อ่านจากไปป์หลังจากที่ subshell ปิด stdin อย่างชัดเจนและนั่นคือเมื่อyes
จะได้รับ SIGPIPE
ข้างต้นเชลล์ส่วนใหญ่ใช้ a pipe(2)
ขณะที่ksh93
ใช้ a socketpair(2)
แต่พฤติกรรมนั้นเหมือนกันในเรื่องนั้น
เมื่อกระบวนการละเว้น SIGPIPE ที่โทรระบบการเขียน (โดยทั่วไปwrite
แต่อาจจะpwrite
, send
, splice
... ) ผลตอบแทนที่มีEPIPE
ข้อผิดพลาด ดังนั้นกระบวนการที่ต้องการจัดการไปป์ที่แตกด้วยตนเองจึงมักจะมองข้าม SIGPIPE และดำเนินการตามข้อผิดพลาด EPIPE