Виртуальное время истекло - PullRequest
0 голосов
/ 06 февраля 2011

У меня следующий код, который выдает ошибку «Виртуальное время истекло». Разве программа не должна работать в бесконечном цикле?

#define KTHREAD_VTALRM_SEC 0
#define KTHREAD_VTALRM_USEC 100000
#include <stdio.h>
#include <unistd.h>
#include <linux/unistd.h>
#include <sys/syscall.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sched.h>
#include <signal.h>
#include <setjmp.h>
#include <errno.h>
#include <assert.h>
#include <string.h>

#include <time.h>
int main()

{
    struct itimerval timeslice;

    timeslice.it_interval.tv_sec = KTHREAD_VTALRM_SEC;
    timeslice.it_interval.tv_usec = KTHREAD_VTALRM_USEC;
    timeslice.it_value.tv_sec = KTHREAD_VTALRM_SEC;
    timeslice.it_value.tv_usec = KTHREAD_VTALRM_USEC;

    setitimer(ITIMER_VIRTUAL,&timeslice,NULL);

    while(1)
    {
        ;
    }
}

Ответы [ 3 ]

2 голосов
/ 06 февраля 2011

Когда время таймера истечет, он доставит сигнал SIGVTALRM, который вы не обрабатываете.

См. Справочные страницы для setitimer () и signal ().

0 голосов
/ 16 января 2014

Обработчиком по умолчанию для сигнала VTALRM является «выход» (ref: http://manpages.ubuntu.com/manpages//precise/en/man1/kill.1.html.)
Поэтому, если вы хотите заменить поведение по умолчанию на ваше, вам нужно определить новый обработчик сигнала и зарегистрировать его:

void vtHandler(int sig)
{
  // Do something here
}

int main()
{
    // Register timer handler
    struct sigaction sa;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;
    sa.sa_handler = timer_handler;

    if (sigaction(SIGVTALRM, &sa, NULL) == -1)
        //error handle
        ;
}

PS: Если вы используете метод signal, убедитесь, что он хорошо реализован в вашей системе (ref: http://manpages.ubuntu.com/manpages//precise/en/man2/signal.2.html)

0 голосов
/ 06 февраля 2011

Вы не установили обработчик сигнала.

...