[英]Will this code block all signals to spawned thread but still catch some in MAIN()?
我在如何使用SIGWAIT阻止線程中的所有信號時寫了一個類似的問題? 但必須承認,我仍然需要100%的主題清晰度... C不是我的日常工作;-)對不起類似的問題...。
我需要100%的澄清是:
我想阻止所有信號進入創建的線程,但是我想在MAIN線程中捕獲下面提到的信號,因此要在創建線程后捕獲SIG_UNBLOCK。
此外,非常重要的是要防止任何中斷我沒有控制權從庫中即SIGINT被“打擾”。 我遇到一種情況,“線程從隊列中獲取消息”上的線程中正在發生等待步驟。 即使在main中定義了信號處理程序,該等待步驟似乎也拒絕了SIGINT,因此下面的SA_RESTART也是如此。
您能否讓我知道下面的代碼是否可以做到這一點? 我很確定可以。
感謝您的幫助,非常感謝
林頓
以下是MAIN程序的代碼段:
int main(int argc, char * argv[]){
sigset_t set;
struct sigaction sa_shutdown;
struct sigaction sa_error;
//Shutdown hook for CTRL-C
sa_shutdown.sa_handler = shutdownHook;
sigemptyset(&sa_shutdown.sa_mask);
sa_shutdown.sa_flags = SA_RESTART;
sigaction(SIGINT, &sa_shutdown, NULL);
//Error handlers for erroneous signals
sa_error.sa_handler = signalErrorHandler;
sigemptyset(&sa_error.sa_mask);
sa_error.sa_flags = SA_RESTART;
sigaction(SIGSEGV, &sa_error, NULL);
sigaction(SIGBUS, &sa_error, NULL);
sigaction(SIGILL, &sa_error, NULL);
sigaction(SIGTERM, &sa_error, NULL);
sigaction(SIGABRT, &sa_error, NULL);
//BLOCK all SIGNALS in threads
sigfillset(&set);
rc = pthread_sigmask(SIG_BLOCK, &set, NULL);
if(rc != 0){
printf("Thread sigmask failed\n");
exit(1);
}
rc = pthread_create(&outboundThread, NULL, outboundThreadMainLoop, (void *)argv);
if(rc != 0){
printf("Thread creation failed\n");
exit(1);
}
pthread_sigmask(SIG_UNBLOCK, &set, NULL);
pthread_join(outboundThread, NULL);
return 0;
}
關於阻止所有信號,您的代碼對我來說還可以。
無論如何,我要說您不應該阻止SIGFPE,SIGILL,SIGSEGV或SIGBUS。
pthread_sigmask()
的手冊頁上說:“ 如果在阻止時生成了SIGFPE,SIGILL,SIGSEGV或SIGBUS信號中的任何一個,則結果是不確定的,除非該信號是由kill()函數生成的,否則sigqueue( )函數或raise()函數。 ”
關於“ ...對庫的中斷... ”:如果您是指以您在示例中所做的方式創建的線程對庫的任何調用,那么我也可以說,它們不會被中斷。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.