2011-11-15 53 views
6

所以我有一個有趣的設計問題。我正在開發SLES 9+ Linux,內核2.6+,並且擁有一個充當RPC客戶端的多線程應用程序。這個想法是有幾個線程來處理請求;一個這樣的要求是作爲兒童過程開始「工作」。主題,信號和兒童處理:多麼美好的世界......真是一個世界

現在我遇到的問題是建立一個適當的信號處理程序來處理各種信號。我所做的是爲信號處理設置另一個線程,使其處於sigwait()狀態,同時阻止其他線程中的所有相關信號。這個想法是,該過程的所有信號應交給信號處理線程,其餘線程應該只處理處理請求,因爲他們進來。

所有這些工作很好,除了那些爛的孩子,總是把他們的飛盤扔進我的後院,並踐踏我的草坪......但是非常嚴肅的是,我的信號處理線程沒有得到SIGCHLD信號。我最好猜測這裏發生的事情是因爲信號處理線程不是產生子線程的線程,它不會是接收SIGCHLD的線程,而是我的工作線程。

,以便爲我的問題:

  1. 我瘋了約SIGCHLD不是讓我的信號處理器線程?
  2. 如果我不瘋狂(這是一段時間,我知道),你將如何去解決這個小問題?目前我所做的就是在所有線程上設置一個非常簡單的SIGCHLD信號處理程序,該信號處理程序簡單地將信號作爲SIGUSR2信號重新發送到進程組,該信號在允許信號處理線程的所有線程中被阻塞。這似乎工作,但我不禁想我要失去的東西或有更好的辦法處理這個......他他,得到它,處理這個......好吧我' LL現在停止

As per David Schwartz request SLES9: NPTL 2.3.5, SLES10: NPTL2.4

+0

我不清楚爲什麼你想要另一個線程來做信號處理。它會被操作系統異步調用。如果在處理程序中有大量工作需要完成,那麼我會編寫一個簡單的快速處理程序,它引發一個信號並引發工作線程。 – EdH

+0

你並不瘋狂。一個信號可以被任何沒有信號阻塞的線程處理。 – nos

+4

「什麼是世界」並不真正描述問題。 –

回答

2

(編輯:因爲我看不懂,你已經在做正確的pthread_sigmask調用....)

在2.6內核中,當SIGCHLD設置爲忽略/ SIG_IGN內核將獲得子進程您。聽起來好像你爲你的信號處理線程設置了SIGCHLD的特定處理程序,以避免將SIGCHLD設置爲SIG_IGN/SIG_DFL。

編輯(來自評論): 我覺得你碰到了一個邊緣情況。如果在產生子代的線程中將其保留爲SIG_IGN,則內核甚至不會發送SIGCHLD。但是,如果您將其設置爲處理,則會調用您的處理程序。我認爲如果你設置了一個處理程序,但是仍然在pthread_sigmask中阻塞信號,那麼信號將被傳送到沒有信號阻塞的線程(你的sigwait線程)。

+0

默認設置爲SIG_IGN,但是我嘗試將SIGCHLD添加到在pthread_sigmask中傳遞的sigmask中並等待它。我看到的問題是,SIGCHLD信號沒有被髮送到信號處理線程,而是似乎只被**發送到產生子線程的線程。我現在所做的工作是在父進程獲得SIGCHLD時,讓父線程向進程組發出SIGUSR2,信號處理程序接收並解釋子進程已經結束並執行相應操作。 – Bob9630

+0

我認爲你遇到了一個邊緣情況。如果在產生子代的線程中將其保留爲SIG_IGN,則內核甚至不會發送SIGCHLD。但是,如果您將其設置爲處理,則會調用您的處理程序。我想知道你是否設置了一個處理程序,但是仍然會阻止pthread_sigmask中的信號,這會起作用嗎? – SoapBox

+0

奇怪的是,它確實...我猜通過強制一個信號處理程序(在我的情況下,我只是使用一個存根)我們「取消了」信號,但是由於SIGCHLD在所有線程中仍然阻塞,由於信號掩碼,交付給當前位於'sigwait()'中的信號處理程序,因此它得到了我一直想要的信號。 幫我一個忙,並在答案部分已有的內容後添加您的答案,我會繼續並接受這個答案。謝謝! – Bob9630

1

編譯和大致相同的編譯選項,你用它來建立你的程序運行此代碼:

#include <pthread.h> 
#include <stdio.h> 
#include <unistd.h> 
int main(void) 
{ 
    char buf[512]; 
    confstr(_CS_GNU_LIBPTHREAD_VERSION, buf, 500); 
    printf("%s\n", buf); 
} 

This announcement對於NPTL是否附帶SLES 9並不是很清楚,如果是,它是否是默認值。但我敢打賭,你正在使用LinuxThreads,它無法將信號指向進程。

+0

他提到了Linux 2.6 ...? – cnicutar