sigaddset()pthread_sigadd()函数之间有什么区别?在以下代码中,如果未注释pthread_sigmask()函数调用,则信号即将到来。

    sigemptyset(&signal_set);
    if( sigaddset(&signal_set,SIGUSR1) == -1){
            printf"sigaddset() retuned error number %d\n",errno);
    }
    //pthread_sigmask ( SIG_BLOCK, &signal_set, NULL );
    while(1){
            if(sigwait(&signal_set, &sig_number) == 0){
                    printf("Got signal\n");
            }
    }

最佳答案

sigaddset()pthread_sigadd()一起使用,但是做不同的事情。


sigaddset()


http://man7.org/linux/man-pages/man3/sigsetops.3.html


  这些功能允许操作POSIX信号集。
  sigaddset()sigdelset()分别从集合中添加和删除信号。



pthread_sigadd()


设置信号后,可以通过sigprocmask() / pthread_sigmask()对其进行屏蔽。

http://man7.org/linux/man-pages/man2/sigprocmask.2.html
http://man7.org/linux/man-pages/man3/pthread_sigmask.3.html


  sigprocmask() [以及pthread_sigmask()]用于获取和/或更改
         调用线程。信号掩码是一组信号,其传递
         目前已被呼叫者阻止(有关更多信息,请参见signal(7)
         细节)。


关于您发布的代码,遇到的信号是预期的工作方式。

http://pubs.opengroup.org/onlinepubs/009695399/functions/sigwait.html


  set定义的信号在调用sigwait()时应已被阻止;否则,行为是不确定的。


因此,您必须始终先阻止信号,然后再等待它们。

关于linux - sigaddset与pthread_sigmask,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30193762/

10-14 01:20