簡體   English   中英

這段代碼會阻塞所有產生的線程的信號,但仍會在MAIN()中捕獲某些信號嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM