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