помогите с сетитимером / проблемой с сигналом - PullRequest
0 голосов
/ 02 сентября 2010

У меня есть следующий код, который, я надеюсь, будет ждать 2 секунды, а затем ждать 5 секунд в цикле.

Есть причина, по которой я не использую it_interval для обновления таймера.*

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
#include <sys/time.h>

#include <semaphore.h>

sem_t sem;

void sighdlr( int sig )
{
    printf( "sighdlr\n" );
    sem_post( &sem );
}

int main( int c, char *v[] )
{
    signal( SIGALRM, sighdlr );

    struct itimerval itv;
    struct tm tm;
    time_t now;

    while( true )
    {
        itv.it_value.tv_sec = 2;
        itv.it_value.tv_usec = 0;
        itv.it_interval.tv_sec = 0;
        itv.it_interval.tv_usec = 0;
        setitimer( ITIMER_REAL, &itv, NULL );

        sem_wait( &sem );
        now = time( NULL );
        localtime_r( &now, &tm );
        fprintf( stderr, "%02d:%02d:%02d\n", tm.tm_hour, tm.tm_min, tm.tm_sec );

        itv.it_value.tv_sec = 5;
        itv.it_value.tv_usec = 0;
        itv.it_interval.tv_sec = 0;
        itv.it_interval.tv_usec = 0;
        setitimer( ITIMER_REAL, &itv, NULL );

        sem_wait( &sem );
        now = time( NULL );
        localtime_r( &now, &tm );
        fprintf( stderr, "%02d:%02d:%02d\n", tm.tm_hour, tm.tm_min, tm.tm_sec );
    }
}

Создает следующий вывод

sighdlr
15:32:50
15:32:50
sighdlr
15:32:52
15:32:52
sighdlr
15:32:54
15:32:54
sighdlr
15:32:56
15:32:56
sighdlr
15:32:58
15:32:58
sighdlr
15:33:00
15:33:00

Не могу понять, почему он не ждет 5 секунд второго таймера.

Любые идеи?

Thx M.

1 Ответ

1 голос
/ 02 сентября 2010

Aha!исправил.

sem_wait прерывался и возвращал -1 и errno == EINTR, поэтому мне нужно что-то вроде этого.

do {
    ret = sem_wait( &sem );
} while( ret < 0 && errno == EINTR );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...