即使信号被禁用,多个信号怎么可能进入处理程序?

时间:2013-03-13 21:29:40

标签: c linux signals posix

所以我将以下代码段作为我程序的一部分。 Handler是SIGALRM的处理程序。

 static void handler(void)
 {
     //DISABLE SIGALRM
     sigset_t oldset;
    disable_sigalrm(&oldset);
        if(queue_length(&queue) == 0)
        {
           ucontext_t context;
           getcontext(&context);
           swapcontext(&context,&uctxt_main);    
        }
        else
        {
            //...
            //enable sigalarm
        }
  }

程序disable_sigalrm如下所示:

void disable_sigalrm(sigset_t* oldset)
{   
sigset_t sset;

//Empty sset
if(sigemptyset(&sset) == -1)
{
    printf("Error in emptying the signal set.\n");
}
//Add SIGALRM to sset
if(sigaddset(&sset,SIGALRM) == -1)
{
    printf("Error in adding SIGALRM to the specified signal set.\n");
}

//Block any occurence of SIGALRM
if(sigprocmask(SIG_BLOCK,&sset,oldset) == -1)
{
    printf("Error in adding the specified signal; set to the signal mask.\n ");
}
   }

现在,即使在队列长度达到零之后我在调试器中运行,它仍然会回到处理程序。 由于SIGALRM被禁用,唯一有意义的解释是有多个信号等待到达处理程序。是否有可能多个信号可以等待运行到处理程序?如果是这样,您如何禁用它们运行处理程序?

0 个答案:

没有答案