2011-02-06 4 views
0

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

#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) 
    { 
     ; 
    } 
} 

ответ

2

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

См. Страницы руководства для setitimer() и сигнала().

0

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

0

Обработчик по умолчанию для сигнала VTALRM является «выход» (ссылка:. 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)

Смежные вопросы