Trong một hệ thống chạy Linux 2.6.35+ chương trình của tôi tạo ra nhiều tiến trình con và giám sát chúng. Nếu một quá trình con chết tôi làm một số làm sạch và đẻ trứng quá trình một lần nữa. Tôi sử dụng signalfd()
để nhận tín hiệu SIGCHLD
trong quá trình của tôi. signalfd
được sử dụng không đồng bộ bằng cách sử dụng libevent
.Xử lý nhiều SIGCHLD
Khi sử dụng bộ xử lý tín hiệu cho tín hiệu thời gian thực, trong khi bộ xử lý tín hiệu đang chạy cho một tín hiệu cụ thể, tín hiệu tương tự phải bị chặn để tránh bị xử lý đệ quy. Nếu nhiều tín hiệu đến lúc đó thì hạt nhân chỉ gọi trình xử lý một lần (khi tín hiệu được bỏ chặn).
Có phải hành vi tương tự khi sử dụng signalfd()
không? Kể từ khi xử lý dựa trên signalfd
không có vấn đề điển hình liên quan đến việc thực hiện không đồng bộ các trình xử lý tín hiệu thông thường, tôi đã nghĩ hạt nhân có thể xếp hàng tất cả các lần xuất hiện khác của SIGCHLD
?
bất cứ ai có thể làm rõ hành vi Linux trong trường hợp này ...
Cảm ơn .. vài câu hỏi ..
Cho phép nói có nhiều sự kiện trong hàng đợi epoll chưa được xử lý bởi quy trình của tôi. Trong trường hợp đó là bạn nói rằng hạt nhân sẽ xếp hàng chỉ có một sự kiện đọc cho SIGCHLD trên signalfd ngay cả khi n quá trình chết? Về việc sử dụng waitpid() trong vòng lặp, vấn đề tôi có với phương pháp này là bạn chỉ có được trạng thái thoát của tiến trình con, nhưng mất thông tin khác mà bạn sẽ nhận được từ struct signalfd_siginfo khi bạn đọc từ signalfd (hoặc siginfo_t khi sử dụng sigaction). Tôi đoán không có cách nào để có được điều đó? – Manohar
@Santhosh lưu ý rằng epoll không xếp hàng các sự kiện mô tả tệp theo nghĩa đen của nó; thay vào đó, nó chỉ báo cáo trạng thái của các bộ mô tả tập tin (khả năng đọc, khả năng ghi). Vì vậy, khi sự kiện xảy ra trên một bộ mô tả tập tin mà làm cho nó dễ đọc, nó không quan trọng có bao nhiêu có - epoll sẽ chỉ báo cáo khả năng đọc.Và lần sau bạn thực hiện epoll_wait(), nó sẽ thực hiện chính xác như cũ (trừ khi bạn sử dụng epoll kích hoạt cạnh - nhưng nó vẫn không báo cáo số lượng sự kiện). Về cấu trúc signalfd_siginfo, tôi tin rằng bạn nói đúng. Nhưng những gì bạn sẽ cần từ đó trong trường hợp của SIGCHLD anyway? –
@Santhosh: cũng lưu ý rằng signalfd() tự nén các tín hiệu SIGCHLD chứ không phải epoll. Điều này có nghĩa không chỉ bạn sẽ không nhận được nhiều sự kiện từ epoll, nhưng bạn sẽ chỉ nhận được một tín hiệu SIGCHLD đơn từ read(); struct signalfd_siginfo của những người khác sẽ bị mất mãi mãi. –