2011-02-06 4 views
0

J'ai le code suivant, qui renvoie l'erreur "Le temps virtuel a expiré". Le programme ne devrait-il pas fonctionner dans une boucle infinie?Le temps virtuel a expiré

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

Répondre

2

Lorsque le temporisateur expire, il envoie un signal SIGVTALRM que vous ne gérez pas.

Voir les pages de manuel de setitimer() et signal().

0

Vous n'avez pas défini de gestionnaire de signal.

0

Le gestionnaire par défaut pour le signal VTALRM est « sortie » (ref. http://manpages.ubuntu.com/manpages//precise/en/man1/kill.1.html)
Donc, si vous voulez remplacer le comportement par défaut avec le vôtre, vous devez définir un nouveau gestionnaire de signal et enregistrer:

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: Si vous utilisez la méthode signal, bien sûr qu'il est bien mis en œuvre sur votre système (ref: http://manpages.ubuntu.com/manpages//precise/en/man2/signal.2.html)