Таймер sys / time.h запускается только один раз - PullRequest
1 голос
/ 07 марта 2019

Я пытаюсь реализовать таймер, который непрерывно отсчитывает определенное количество времени во время работы программного обеспечения.Я написал грязный код, чтобы попытаться понять, как работает sys / time.h.
Насколько я понимаю, если я установлю в своей структуре it_interval ненулевое значение, таймер снова начнет отсчет, как только будет выполнен подсчет сохраненного значения.в it_value struct.
Однако мой код останавливается.Может кто-нибудь сказать мне, что мне не хватает в моем коде, пожалуйста?Кроме того, я использую Linux.

#include <sys/time.h>
#include <stdio.h>
#include <stdint.h>

int main(void) {
    struct itimerval timer1;

    timer1.it_interval.tv_sec = 5;
    timer1.it_interval.tv_usec = 0;
    timer1.it_value.tv_sec = 5;
    timer1.it_value.tv_usec = 0 ;
    setitimer(ITIMER_REAL, &timer1, NULL);
    printf( "init interval counter: %ld.%ld\n", timer1.it_interval.tv_sec, 
    timer1.it_interval.tv_usec);
    printf( "init value counter: %ld.%ld\n\n", timer1.it_value.tv_sec, 
    timer1.it_value.tv_usec );

    while(1) {
        for (int i = 0; i < 100000000000000; i++){
            getitimer(ITIMER_REAL, &timer1);
            printf( "end interval counter: %ld.%ld\n", 
            timer1.it_interval.tv_sec, timer1.it_interval.tv_usec);
            printf( "end value counter: %ld.%ld\n\n", 
            timer1.it_value.tv_sec, timer1.it_value.tv_usec );
        }
    }
    return 0;
}

Мой вывод (сокращенный, конечно):
счетчик конечных интервалов: 5,0
счетчик конечных значений: 0,8821

счетчик конечных интервалов: 5.0Сигналы будильника

Процесс вернул 142 (0x8E) время выполнения: 5,033 с

Заранее спасибо за помощь!

1 Ответ

0 голосов
/ 07 марта 2019

setitimer(ITIMER_REAL,...) заставляет SIGALRM быть отправлено вызывающему процессу по истечении таймера. SIGALRM является обычно смертельным сигналом, чье расположение по умолчанию - убить процесс.

Если вы хотите предотвратить остановку вашего процесса этим сигналом, вам нужно как-то обработать его.

Пример (печатает EXPIRED из обработчика каждые 100 мс) в зависимости от вашего кода:

#include <sys/time.h>
#include <stdio.h>
#include <stdint.h>
#include <signal.h>
#include <unistd.h>
void handler(int Sig)
{
    (void)Sig;
    char msg[]="EXPIRED\n";
    ssize_t nwr = write(1,msg,sizeof(msg)-1); (void)nwr;
}
int main(void) {
    struct itimerval timer1;
    struct sigaction sa;
    sa.sa_handler = handler;
    sa.sa_flags = 0;
    sigemptyset(&sa.sa_mask);
    sigaction(SIGALRM,&sa,0);

    timer1.it_interval.tv_sec = 0;
    timer1.it_interval.tv_usec = 100000;
    timer1.it_value.tv_sec = 0;
    timer1.it_value.tv_usec = 100000 ;
    setitimer(ITIMER_REAL, &timer1, NULL);
    printf( "init interval counter: %ld.%ld\n", timer1.it_interval.tv_sec, 
    timer1.it_interval.tv_usec);
    printf( "init value counter: %ld.%ld\n\n", timer1.it_value.tv_sec, 
    timer1.it_value.tv_usec );

    while(1) pause();
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...