这段代码是否会阻止所有信号生成线程,但仍会在MAIN()中捕获一些信号?

时间:2011-11-14 10:34:21

标签: c

我在How to block all SIGNALS in thread WITHOUT using SIGWAIT?写了一个类似的问题,但必须承认我仍然需要100%清晰的主题...... C不是我的日常工作;-)对不起,类似的问题....

所有我需要100%澄清的是:

  • 我想阻止所有信号进入我创建的线程,但我想在MAIN线程中捕获下面提到的信号,因此在创建线程后捕获SIG_UNBLOCK。 / p>

  • 同样非常重要的是防止对我无法控制的库的任何中断在SIGINT期间被“干扰”。我有一种情况,在“从队列中获取消息GET”的线程中发生了WAIT步骤。即使信号处理程序在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;
}

1 个答案:

答案 0 :(得分:0)

关于阻止所有信号,你的代码看起来还不错。

无论如何,我要说你不应该阻止SIGFPE,SIGILL,SIGSEGV或SIGBUS。

pthread_sigmask()的手册页说:“如果在阻塞时生成任何SIGFPE,SIGILL,SIGSEGV或SIGBUS信号,结果是不确定的,除非信号是由kill()函数,sigqueue()函数或raise()函数。

关于“ ...对库的中断...... ”:如果你指的是从你在你的例子中创建的线程中对库的任何调用,我也会说没关系,他们不会被打断。