вопрос linux sigtimedwait - PullRequest
       2

вопрос linux sigtimedwait

0 голосов
/ 19 октября 2011

Я пытаюсь использовать 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 Ответ

3 голосов
/ 19 октября 2011

Я думаю, вы можете упустить какую-то логику там.Если вы получите сообщение об ошибке, возвращающее -1, но errno равно , а не EAGAIN, вы, вероятно, предполагаете, что оно сработало, а переменная oInfo содержит действительные данные.

Это может привести кпроблема, если ваш процесс прерывается во время ожидания, так как один из действительных кодов возврата равен EINTR.

В этом случае oInfo будет содержать любой мусор, который был включенстек, когда вы входили в эту функцию, что подтверждается тем фактом, что я вполне уверен, что сигналы не доходят до 4714397: -)

Простой способ выяснить: распечатать iRet и errno в вашем случае по умолчанию.

В вашей строке также есть что-то ужасно неправильное:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...