Khi bạn ống hai quá trình và giết một tại "đầu ra" của đường ống, quá trình đầu tiên được sử dụng để nhận được tín hiệu "Broken Pipe", mà thường chấm dứt nó là tốt. Ví dụ. chạyỐng bị hỏng không còn kết thúc chương trình nữa?
$> do_something_intensive | less
và sau đó thoát ít sử dụng để trả lại cho bạn ngay lập tức với một vỏ đáp ứng, trên một SuSE8 hoặc phiên bản cũ. khi tôi đang cố gắng hôm nay, do_something_intensive rõ ràng vẫn đang chạy cho đến khi tôi xóa thủ công. Có vẻ như một cái gì đó đã thay đổi (glib? Shell?) Khiến chương trình bỏ qua "các đường ống bị hỏng" ...
Bất kỳ ai trong các bạn đều có gợi ý về điều này? làm thế nào để khôi phục lại hành vi cũ? tại sao nó đã được thay đổi (hoặc tại sao nó luôn tồn tại nhiều ngữ nghĩa)?
chỉnh sửa: thử nghiệm thêm (sử dụng strace) cho thấy "SIGPIPE" được tạo ra, nhưng mà chương trình không bị gián đoạn. Một đơn giản
#include <stdio.h>
int main()
{
while(1) printf("dumb test\n");
exit(0);
}
sẽ tiếp tục với một bất tận
--- SIGPIPE (Broken pipe) @ 0 (0) ---
write(1, "dumb test\ndumb test\ndumb test\ndu"..., 1024) = -1 EPIPE (Broken pipe)
khi ít bị giết. Tôi có thể chắc chắn chương trình xử lý tín hiệu trong chương trình của tôi và đảm bảo nó chấm dứt, nhưng tôi đang tìm kiếm một số biến môi trường hoặc tùy chọn trình bao sẽ buộc các chương trình chấm dứt trên SIGPIPE
chỉnh sửa lại: có vẻ như là một vấn đề cụ thể tcsh (bash xử lý nó đúng) và phụ thuộc vào thiết bị đầu cuối (Eterm 0.9.4)
Nó sẽ giúp bạn biết bạn đang sử dụng trình bao nào và cụ thể hơn về những gì do_something_intensive thực sự làm. Ngoài ra, bạn có ý nghĩa gì bởi "rõ ràng vẫn đang chạy"? Nó có hiển thị trong danh sách ps hay không, hoặc là shell không phản hồi? Vui lòng chỉnh sửa câu hỏi của bạn với nhiều chi tiết hơn! – ehdr
nó xuất hiện trong một danh sách PS, sheel không đáp ứng cho đến khi tôi giết toàn bộ chuỗi với CTRL + C và sử dụng CPU được cao trong gkrellm. vỏ được sử dụng là tcsh, như được đề cập trong câu hỏi chi tiết hơn. cám ơn bạn đã góp ý. – PypeBros