我有一個主應用程序,生成一個單獨的線程來處理隊列中的消息。當我點擊CTRL-C時,我在AIX上遇到問題,因爲它似乎使線程中的某些「連接句柄」變得無效。我在捕獲SIGINT的主程序中有一個關閉鉤子,但在AIX上,它似乎以某種方式向該線程發送了一個信號......雖然從我聽到的內容來看,這並不是真的可能...如何在不使用SIGWAIT的情況下阻塞線程中的所有信號?
本質上,想知道我是否希望MAIN應用程序能夠處理我感興趣的所有信號,並讓線程從不處理任何信號......這是「良好實踐」嗎?
如果是這樣我怎麼能不在線程中使用「sigwait」......實際上我不想在線程中有任何「信號代碼」......它們根本不會收到任何信號。
我已經清空了所有的信號:
sigemptyset(&set);
,並且已經設置了SIG_BLOCK
s = pthread_sigmask(SIG_BLOCK, &set, NULL);
因此,這裏是一個僞測試PROGRAME:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>
#define handle_error_en(en, msg) do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)
static void * threadMainLoop(){
//Here I do not want the thread to use "sigwait"....
while(running == TRUE){
//do some thread work and never have any signals come in
}
}
void shutdownHook(int sig){
printf("\nCtrl-C pressed....shutdown hook in main...\n");
}
void signalErrorHandler(int signum){
printf("\nSignal error handler in main...\n");
}
int main(int argc, char *argv[]){
pthread_t thread;
sigset_t set;
int s;
//Catch the following signals in the MAIN thread
(void) signal(SIGINT, shutdownHook);
(void) signal(SIGSEGV, signalErrorHandler);
(void) signal(SIGBUS, signalErrorHandler);
(void) signal(SIGILL, signalErrorHandler);
(void) signal(SIGTERM, signalErrorHandler);
(void) signal(SIGABRT, signalErrorHandler);
sigemptyset(&set); //BLOCK all signals
s = pthread_sigmask(SIG_BLOCK, &set, NULL);
if (s != 0)
handle_error_en(s, "pthread_sigmask");
s = pthread_create(&thread, NULL, &threadMainLoop, (void *) NULL);
if (s != 0)
handle_error_en(s, "pthread_create");
pause();
}
如果我剛剛創建一個線程,並且例如在主線程中具有SIGINT信號處理程序,但沒有將SIG_BLOCK設置爲廣告和用戶點擊CTRL-C ....即使主線程中的信號處理程序運行,線程是否也會受到影響?這似乎是我所看到的在AIX上;-(
感謝您的幫助,非常感謝
林頓
您好,但它設置「s = pthread_sigmask(SIG_BLOCK,&設置,NULL);」並用CTRL-C測試線程不接收信號?這意味着它阻止了它?如果我添加「sigaddset(&set,SIGINT);」那麼線程收到信號。原諒我,如果我在這裏錯了...我仍然在學習...... ;-)感謝您的幫助;-) –
更新了答案一點..信號掩碼是無法提出的信號。所以如果你做sigaddset(&set,SIGINT); pthread_sigmask(SIG_BLOCK,&set,NULL); ,SIGINT將設置在singnal掩碼中,這意味着線程不會收到它。如果您創建一個新線程,該線程會從創建它的線程繼承信號掩碼。 – nos
請注意,如果你想要一個新的線程以掩碼的信號開始(通常是避免討厭的競態條件所必需的),你需要在調用'pthread_create'之前阻止信號,然後在'pthread_create'返回之後恢復原始線程中的舊信號掩碼。 –