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