linux sigtimedwait issue



我试着根据下面的代码使用sigtimedwait,我得到了这个消息"捕获意外信号4714397,错误0,代码370078816"。有人知道我在哪里能找到这些数字的对应地图吗?

    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 %dn", oInfo.si_signo, oInfo.si_errno,oInfo.si_code),oInfo.si_code) ;
                break;
            }
        }
    }

我想你可能遗漏了一些逻辑。如果你得到一个错误返回-1,但errno不是 EAGAIN,你似乎假设它工作,oInfo变量包含有效的数据。

如果您的进程在等待期间被中断,这可能会导致问题,因为其中一个有效的返回码是EINTR

在这种情况下,oInfo将包含当您进入该函数时堆栈上的任何垃圾,这一事实证明,我非常确定信号不会达到4714397:-)

简单的方法来找出:打印出iReterrno在你的默认情况下。

你的这一行也有一些可怕的错误:

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

但是我假设这只是你的一个打字错误,它实际上是这样的:

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

我要做的改变是:

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