2011-10-19 4 views
0

私は以下のコードに従ってsigtimedwaitを試してみます。このメッセージは "予期せぬシグナル4714397、エラー0、コード370078816"となっています。誰も私がそれらの番号の対応するマップを知ることができるか知っていますか?linux sigtimedwait issue

sigset_t oMask; 
    siginfo_t oInfo; 
    struct timespec oTimeout; 

    /* Create a mask holding */ 

    sigemptyset(&oMask); 
    sigaddset(&oMask, SIGINT); 
    sigaddset(&oMask, SIGTERM); 

    /* Set the mask for our main thread to include SIGINT */ 

    pthread_sigmask(SIG_BLOCK, &oMask, NULL); 

    /* Max wait for ^C set to 5 seconds */ 

    oTimeout.tv_sec = 5; 
    oTimeout.tv_nsec = 0; 

    int iRet = -1; 
    bool bStop = false; 
    while (!bStop) 
    { 
     iRet = sigtimedwait(&oMask, &oInfo, &oTimeout); 
     if (-1 == iRet && EAGAIN == errno) 
     { 
     } 
     else 
     { 
      switch (oInfo.si_signo) 
      { 
      case SIGINT: 
       printf("Caught SIGINT in sigtimedwait()\n"); 
       bStop = true; 
       break; 
      case SIGTERM: 
       printf("Caught SIGTERM in sigtimedwait()\n"); 
       bStop = true; 
       break; 
       /* Should never really get to default */ 

      default: 
       printf("Caught unexpected signal %d, error %d, code %d\n", oInfo.si_signo, oInfo.si_errno,oInfo.si_code),oInfo.si_code) ; 
       break; 
      } 
     } 
    } 

答えて

3

私はそこにいくつかのロジックがないかもしれないと思います。エラーの戻り値が-1の場合、errnoで、EAGAINではないと思われますが、oInfo変数には有効なデータが含まれていると考えられます。

one of the valid return codesEINTRなので、待機中にプロセスが中断した場合に問題が発生することがあります。その場合

oInfoは、あなたがその機能に入ったとき、スタック上にあった、私はかなり特定の信号だという事実によって裏付け何かが

:-) 4714397まで行っていないものは何でもゴミ含めるために起こっています

簡単な方法:iReterrnoをデフォルトのケースで印刷してください。

あり、あなたのラインと恐ろしく間違って何かでもあります:

printf("Caught unexpected signal %d, error %d, code %d\n", 
    oInfo.si_signo, oInfo.si_errno,oInfo.si_code),oInfo.si_code) ; 

は、私はそれはあなたの部分のちょうどタイプミスだと仮定するつもりだし、それは本当にのようなものです:私

printf ("Caught unexpected signal %d, error %d, code %d\n", 
    oInfo.si_signo, oInfo.si_errno, oInfo.si_code); 

変更

printf ("Caught unexpected signal %d, error %d, code %d, errno %d, iret %d\n", 
    oInfo.si_signo, oInfo.si_errno, oInfo.si_code, errno, iRet); 
+0

ありがとうございます。私は "if(-1 == iRet && EAGAIN == errno)"を "if(-1 == iRet)"に変更した後、iRetとerrnoを出力しようとします。私はそれがエラーコード4(EINTR)を印刷し、次に11(EAGAIN)を見つけ、印刷EAGAINを維持することが分かった。実際にどのような状況で、EAGAINは放置されていますか? –

+0

'[EINTR]待機は、ブロックされていない捕捉された信号によって中断されました。 'EAGAIN'シナリオのように' sigtimedwait'を引き続き呼び出すのではなく、すべてのものを再度設定しなければならないことを意味します。 – paxdiablo