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