Vì chương trình của bạn có thể đang đợi I / O hoặc bị tạm ngưng. SIGPIPE làm gián đoạn chương trình của bạn một cách không đồng bộ, chấm dứt cuộc gọi hệ thống và do đó có thể được xử lý ngay lập tức.
Cập nhật
Hãy xem xét một đường ống dẫn A | B | C
.
Chỉ để xác định, chúng tôi sẽ giả định rằng B là vòng lặp sao chép chính tắc:
while((sz = read(STDIN,bufr,BUFSIZE))>=0)
write(STDOUT,bufr,sz);
B
bị chặn trên cuộc gọi đọc (2) chờ dữ liệu từ A
khi C
kết thúc. Nếu bạn đợi mã trả về từ ghi (2) thì khi nào B sẽ thấy nó? Câu trả lời, tất nhiên, không phải là cho đến khi A ghi thêm dữ liệu (có thể là một thời gian dài chờ đợi - điều gì sẽ xảy ra nếu A bị chặn bởi thứ khác?). Nhân tiện, hãy lưu ý rằng điều này cũng cho phép chúng ta có một chương trình đơn giản hơn, gọn gàng hơn. Nếu bạn phụ thuộc vào mã lỗi khi ghi, bạn cần một cái gì đó như:
while((sz = read(STDIN,bufr,BUFSIZE))>=0)
if(write(STDOUT,bufr,sz)<0)
break;
Cập nhật khác
Aha, bạn đang bối rối về hành vi của văn bản. Bạn thấy đấy, khi đóng bộ mô tả tệp có ghi đang chờ xử lý, SIGPIPE sẽ xảy ra ngay lúc đó. Mặc dù cuối cùng quá trình ghi sẽ trả về -1 , nhưng toàn bộ điểm của tín hiệu là thông báo cho bạn một cách không đồng bộ rằng việc ghi không còn khả thi nữa. Đây là một phần của những gì làm cho toàn bộ cấu trúc đồng quy trình thanh lịch của đường ống hoạt động trong UNIX.
Bây giờ, tôi có thể hướng dẫn bạn đến toàn bộ cuộc thảo luận trong bất kỳ cuốn sách lập trình hệ thống UNIX nào, nhưng có một câu trả lời tốt hơn: bạn có thể tự xác minh điều này. Viết một B
chương trình đơn giản [1] - bạn đã có gan, tất cả những gì bạn cần là một main
và một số bao gồm - và thêm một trình xử lý tín hiệu cho SIGPIPE
. Chạy một đường dẫn như
cat | B | more
và trong một cửa sổ đầu cuối khác, hãy gắn trình gỡ lỗi vào B và đặt một điểm ngắt bên trong trình xử lý tín hiệu B.
Bây giờ, giết nhiều hơn và B sẽ phá vỡ bộ xử lý tín hiệu của bạn. kiểm tra ngăn xếp. Bạn sẽ thấy rằng bài đọc vẫn đang chờ xử lý. hãy để trình xử lý tín hiệu tiến hành và quay lại, và xem kết quả trả về bằng ghi - sau đó sẽ là -1.
[1] Đương nhiên, bạn sẽ viết chương trình B của mình bằng C. :-)
write
.