linux sigtimedwait问题

时间:2011-10-19 04:15:05

标签: linux signals

我根据下面的代码尝试使用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 %d\n", oInfo.si_signo, oInfo.si_errno,oInfo.si_code),oInfo.si_code) ;
                break;
            }
        }
    }

1 个答案:

答案 0 :(得分: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);