したがって、プログラムの一部として次のコード セグメントがあります。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 が無効になっているため、意味のある唯一の説明は、ハンドラーに到達するのを待っている複数のシグナルがある場合です。複数のシグナルがハンドラーへの実行を待機できる可能性はありますか? もしそうなら、ハンドラーを実行しているそれらをどのように無効にしますか?