所以我有一個有趣的設計問題。我正在開發SLES 9+ Linux,內核2.6+,並且擁有一個充當RPC客戶端的多線程應用程序。這個想法是有幾個線程來處理請求;一個這樣的要求是作爲兒童過程開始「工作」。主題,信號和兒童處理:多麼美好的世界......真是一個世界
現在我遇到的問題是建立一個適當的信號處理程序來處理各種信號。我所做的是爲信號處理設置另一個線程,使其處於sigwait()
狀態,同時阻止其他線程中的所有相關信號。這個想法是,該過程的所有信號應交給信號處理線程,其餘線程應該只處理處理請求,因爲他們進來。
所有這些工作很好,除了那些爛的孩子,總是把他們的飛盤扔進我的後院,並踐踏我的草坪......但是非常嚴肅的是,我的信號處理線程沒有得到SIGCHLD信號。我最好猜測這裏發生的事情是因爲信號處理線程不是產生子線程的線程,它不會是接收SIGCHLD的線程,而是我的工作線程。
,以便爲我的問題:
- 我瘋了約SIGCHLD不是讓我的信號處理器線程?
- 如果我不瘋狂(這是一段時間,我知道),你將如何去解決這個小問題?目前我所做的就是在所有線程上設置一個非常簡單的SIGCHLD信號處理程序,該信號處理程序簡單地將信號作爲SIGUSR2信號重新發送到進程組,該信號在允許信號處理線程的所有線程中被阻塞。這似乎工作,但我不禁想我要失去的東西或有更好的辦法處理這個......他他,得到它,處理這個......好吧我' LL現在停止
As per David Schwartz request SLES9: NPTL 2.3.5, SLES10: NPTL2.4
我不清楚爲什麼你想要另一個線程來做信號處理。它會被操作系統異步調用。如果在處理程序中有大量工作需要完成,那麼我會編寫一個簡單的快速處理程序,它引發一個信號並引發工作線程。 – EdH
你並不瘋狂。一個信號可以被任何沒有信號阻塞的線程處理。 – nos
「什麼是世界」並不真正描述問題。 –