Tôi có một kịch bản Perl mà dĩa.Điều gì xảy ra với SIGINT (^ C) khi được gửi đến một kịch bản perl có chứa trẻ em?
Mỗi ngã ba chạy một chương trình bên ngoài, phân tích đầu ra và chuyển đổi đầu ra thành tệp Storable.
Các tệp đáng tin cậy sau đó được đọc bởi phụ huynh và tổng dữ liệu từ mỗi trẻ được phân tích trước khi tiếp tục lặp lại của ngã ba trước đó hoặc người khác dừng lại.
Điều gì xảy ra chính xác khi tôi phát hành^C trong khi một số trẻ vẫn đang chạy chương trình bên ngoài? Các kịch bản mẹ perl được gọi là ở phía trước và, tôi đoán, vẫn ở phía trước mặc dù forking.
SIGINT có được truyền cho tất cả trẻ em, đó là cha mẹ, con của cha mẹ và chương trình bên ngoài được gọi bởi trẻ em không ??
CẬP NHẬT:
tôi nên thêm, dường như khi tôi hành SIGINIT, các chương trình bên ngoài gọi bằng con cái kịch bản của tôi dường như thừa nhận tín hiệu và chấm dứt. Nhưng trẻ em, hoặc có lẽ là chương trình phụ huynh, tiếp tục. Điều này là tất cả không rõ ràng với tôi.
UPDATE 2:
đối với bình luận tchrist hề có, sự chương trình bên ngoài được gọi với lệnh Perl của system()
.
Trong thực tế, nhận xét của tchrist cũng dường như chứa lời giải thích mà tôi đang tìm kiếm. Sau khi một số gỡ lỗi nhiều hơn, dựa trên hành vi của chương trình của tôi, có vẻ như, SIGINT đang được chuyển từ cha mẹ cho tất cả trẻ em và từ tất cả trẻ em cho tất cả con cái của họ (chương trình bên ngoài).
Vì vậy, những gì dường như đang xảy ra, dựa trên nhận xét của tchrist, là CTRL-C đang giết chết chương trình bên ngoài khiến trẻ di chuyển ra khỏi lệnh system()
- và không có gì khác.
Mặc dù tôi có con tôi kiểm tra trạng thái thoát của những gì được gọi trong system()
, tôi giả định rằng CTRL-C sẽ giết mọi thứ từ cấp độ gốc, thay vì dẫn đến việc tạo nhiều vòng xử lý hơn chuyện gì đã xảy ra!!!
SOLUTION (cho vấn đề của tôi):
tôi cần phải chỉ cần tạo một handler tín hiệu cho SIGINT trong các phụ huynh. Sau đó, trình xử lý tín hiệu sẽ gửi SIGTERM đến từng đứa trẻ (mà tôi cho là sẽ gửi một SIGTERM tới các trẻ em), và sau đó khiến cha mẹ thoát khỏi một cách duyên dáng. Mặc dù giải pháp hơi rõ ràng này có khả năng sẽ có những thứ cố định, tôi muốn hiểu quan niệm sai lầm của tôi về hành vi của SIGINT liên quan đến việc làm giả trong Perl.
Bạn chưa biết bạn có đang tung phiên bản 'system()' của riêng mình hay một đường ống mở hoặc backticks hay cho dù bạn đang sử dụng Perl hay không. Nếu bạn đang sử dụng Perl, thì cha/mẹ - người gọi là 'hệ thống' không phải là người được gọi bởi nó - sẽ loại bỏ bất kỳ SIGINT và SIGQUIT nào trong khi các trẻ đang chạy. Nếu bạn đã tự mình cuộn, bạn phải tự mình nghĩ về những vấn đề này. Hãy xem xét điều gì sẽ xảy ra khi bạn sử dụng 'system (" vi somefile ")' và nhấn^C trong một tìm kiếm dài trong 'vi': chỉ' vi' có một SIGINT (nonfatal); cha mẹ bỏ qua nó. Đây là hành vi đúng. – tchrist
Cảm ơn, tchrist. Đặt câu trả lời này thành câu trả lời để tôi có thể đánh dấu câu trả lời là đã được chấp nhận. – EMiller