Một quá trình nhận được SIGPIPE khi nó cố ghi vào một đường ống (có tên hoặc không) hoặc ổ cắm loại SOCK_STREAM không còn đầu đọc.
Đó thường là hành vi muốn. Một ví dụ điển hình là:
find . | head -n 1
Bạn không muốn find
tiếp tục chạy một khi head
đã chấm dứt (và sau đó đóng bộ mô tả tệp duy nhất mở để đọc trên đường ống đó).
Các yes
lệnh thường dựa vào đó tín hiệu chấm dứt.
yes | some-command
Sẽ viết "y" cho đến khi một số lệnh kết thúc.
Lưu ý rằng không chỉ khi thoát lệnh, đó là khi tất cả người đọc đã đóng fd đọc của họ vào đường ống. Trong:
yes | ( sleep 1; exec <&-; ps -fC yes)
1 2 1 0
Sẽ có 1 (subshell), sau đó 2 (subshell + ngủ), sau đó 1 (subshell) rồi 0 fd đọc từ ống sau khi subshell đóng rõ ràng stdin của nó và khi đó yes
sẽ nhận được SIGPIPE.
Ở trên, hầu hết các shell sử dụng một pipe(2)
thời gian ksh93
sử dụng a socketpair(2)
, nhưng hành vi là như nhau về vấn đề đó.
Khi một quá trình bỏ qua các SIGPIPE, cuộc gọi hệ thống chữ viết (nói chung write
, nhưng có thể pwrite
, send
, splice
...) trở lại với một EPIPE
lỗi. Vì vậy, các quy trình muốn xử lý đường ống bị hỏng theo cách thủ công thường bỏ qua SIGPIPE và thực hiện hành động khi xảy ra lỗi EPIPE.