Vì vậy, tôi có một vấn đề thiết kế thú vị. Tôi đang làm việc trên SLES 9+ Linux, kernel 2.6+ và có một ứng dụng đa luồng hoạt động như một máy khách RPC. Ý tưởng là có một vài luồng để xử lý các yêu cầu; một yêu cầu như vậy là bắt đầu một "công việc" như một tiến trình con.Chủ đề, tín hiệu và xử lý trẻ em: Thật là một thế giới ... Thật là một thế giới
Bây giờ vấn đề tôi đang gặp phải là thiết lập trình xử lý tín hiệu thích hợp để xử lý nhiều tín hiệu khác nhau. Những gì tôi đã làm là thiết lập một luồng khác để xử lý tín hiệu đang ở trạng thái sigwait()
trong khi chặn tất cả các tín hiệu liên quan trong các chủ đề khác. Ý tưởng là tất cả các tín hiệu cho quá trình sẽ được gửi đến chuỗi xử lý tín hiệu và phần còn lại của chủ đề chỉ nên lo lắng về các yêu cầu xử lý khi chúng đến.
Tất cả điều này đều tuyệt vời ngoại trừ những đứa trẻ thối rữa, luôn luôn ném Frisbees của họ trong sân sau của tôi và chà đạp trên tất cả các bãi cỏ của tôi ... nhưng trong tất cả các mức độ nghiêm trọng, xử lý tín hiệu của tôi không nhận được tín hiệu SIGCHLD. Suy đoán tốt nhất của tôi về những gì đang xảy ra ở đây là bởi vì chuỗi truyền tín hiệu không phải là chủ đề sinh ra đứa trẻ, nó sẽ không phải là luồng nhận SIGCHLD, mà thay vào đó là chuỗi công việc của tôi.
Vì vậy, như đối với câu hỏi của tôi:
- Tôi phát điên lên vì SIGCHLD không làm cho nó vào chủ đề xử lý tín hiệu của tôi?
- Nếu tôi không điên (đó là một căng, tôi biết), làm thế nào bạn sẽ đi về sửa chữa vấn đề này ít? Hiện tại những gì tôi đang làm là thiết lập một trình xử lý tín hiệu rất đơn giản cho SIGCHLD được thiết lập trên tất cả các luồng chỉ đơn giản gửi lại tín hiệu như tín hiệu SIGUSR2 đến nhóm xử lý bị chặn trong tất cả các luồng cho phép xử lý tín hiệu. có vẻ như để làm việc, tuy nhiên tôi không thể không nghĩ rằng tôi đang thiếu một cái gì đó HOẶC có một cách tốt hơn để xử lý điều này ... anh ấy, nhận được nó, xử lý this ... okay ' ll dừng tại
As per David Schwartz request SLES9: NPTL 2.3.5, SLES10: NPTL2.4
Tôi không rõ lý do tại sao bạn muốn một luồng khác xử lý tín hiệu. Nó sẽ được hệ điều hành gọi là không đồng bộ.Nếu có một loạt các công việc phải được thực hiện trong trình xử lý, sau đó tôi sẽ viết một trình xử lý đơn giản, nhanh chóng mà ném một semaphore và đặt ra các sợi công nhân. – EdH
Bạn không điên. Một tín hiệu có thể được xử lý bởi * bất kỳ * thread mà không có tín hiệu bị chặn. – nos
"Thật là một thế giới" không thực sự mô tả vấn đề. –