1

所以我有以下代码段作为我的程序的一部分。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 被禁用,唯一有意义的解释是是否有多个信号等待到达处理程序。是否有可能多个信号可以等待运行到处理程序?如果是这样,您将如何禁用它们运行处理程序?

4

0 回答 0