Fonctions système Linux de gestion des timers

Complément de cours

Types

struct timeval
struct timespec
struct itimerval
Constantes
ITIMER_PROF ITIMER_REAL ITIMER_VIRTUAL
Fonctions
alarm()
nanosleep()
getitimer()
setitimer()


Les délais sous Unix

    Pour stocker un délai, la bibliothèque des fonctions système Unix (écrite en C) utilise les deux structures suivantes, décrites respectivement dans les fichier <sys/time.h> et <time.h> :
 
struct timeval
{
    long tv_sec;   /* en secondes       */
    long tv_usec;  /* en micro-secondes */
};

et
 
struct timespec
{
    time_t  tv_sec;         /* secondes                                 */
    long    tv_nsec;        /* nano-secondes  = milliardième de seconde */

}; // timespec


Les délais des timers sous Unix

      Les deux délais nécessaires pour définir un timer Unix peuvent être stockés dans la structure suivante, déclarée dans  le fichier <sys/time.h> :
 
struct itimerval
{
    struct timeval it_interval;  /* intervalle entre deux signaux */
    struct timeval it_value;     /* delai initial                 */
};


Les timers sous Unix

    Les trois types de timers Unix sont définis au moyen des constantes suivantes, déclarées dans le fichier <sys/time.h> :
 
#define ITIMER_REAL    0     /* declenche SIGALRM    */
#define ITIMER_VIRTUAL 1     /* declenche SIGVTALRM  */
#define ITIMER_PROF    2     /* declenche SIGPROF    */

    Les fonctions système permettant de manipuler les timers sont alarm(), getitimer() et setitimer() :


alarm()

Nom
alarm - arme un timer
Syntaxe
 
#include <unistd.h> // contient le prototype de la fonction alarm()

unsigned int alarm (unsigned int nb_sec);

Description

    La fonction alarm() arme le timer ITIMER_REAL avec une durée de nb_sec secondes. A l'écoulement de ce délai (au minimum), le processus reçoit le signal SIGALRM. Le timer est alors désarmé.

Valeur retournée

    La fonction alarm() renvoie la valeur du temps restant dans le timer au moment de son appel. Cette valeur peut être utilisée à réception du signal SIGALRM pour restaurer le timer. Les fonctions alarm() et getitimer() peuvent donc interférer sur le même timer ITIMER_REAL.

Diagnostic d'erreur

    La fonction alarm() ne peut pas renvoyer de code d'erreur.


nanosleep()

Nom
nanosleep - suspend le processus pendant un délai exprimé en nano-secondes
Syntaxe
 
#include <unistd.h> // contient le prototype de la fonction nanosleep()
                    // et de struct timespec

int nanosleep (const struct timespec *req, struct timespec *rem);

Description

    La fonction nanosleep() suspend le processus pendant un délai supérieur ou égal à la valeur contenue dans une structure pointée par le paramètre req, et exprimée en nano-secondes. De plus, la précision dépend du système et de la machine, et peut varier dans une très large plage (1 micro-seconde pour un noyau Linux temps réel à 10 milli-secondes sous Linux/i386).

    Si la fonction est interrompue par la réception d'un signal, et si le pointeur rem est non nul, il pointe sur une structure contenant le délai restant au moment de l'interruption. Attention : si la fonction nanosleep() se termine normalement lorsque le délai est épuisé, la structure pointée par rem n'est pas remise à zéro.

Valeur retournée

    La fonction nanosleep() renvoie 0 en cas de retour normal (épuisement du délai).

Diagnostic d'erreur

    La fonction nanosleep() renvoie -1 en cas d'erreur ou d'interruption par un signal. La variable globale errno est alors positionnée.


getitimer()

Nom
getitimer - renvoie la valeur d'un timer
Syntaxe
 
#include <sys/time.h>  // contient le prototype de la fonction getitimer()
                       //   et de struct itimerval

int getitimer (int which, const struct itimerval *valeur);

Description

    La fonction getitimer() remplit le paramètre valeur avec la valeur du timer indiqué par which (parmi : ITIMER_REAL, ITIMER_VIRTUAL ou ITIMER_PROF).

Valeur retournée

    La fonction getitimer() renvoie 0 si l'appel s'est bien passé.

Diagnostic d'erreur

    La fonction getitimer() renvoie -1 en cas d'erreur. La variable globale errno est alors positionnée.


setitimer()

Nom
setitimer - initialise la valeur d'un timer.
Syntaxe
 
#include <sys/time.h>  // contient le prototype de setitimer ()
                       //   et de struct itimerval

int setitimer (int which, const struct itimerval *value,
                                struct itimerval *o_value);

Description

    La fonction setitimer() initialise le timer indiqué par which (parmi : ITIMER_REAL, ITIMER_VIRTUAL ou ITIMER_PROF) à la valeur value (2 délais). Si value->it_interval == 0, le timer sera désarmé après la prochaine expiration. Si le pointeur o_value n'est pas nul, il doit pointer sur la variable o_value qui recevra la valeur qu'avait le timer avant modification. Cette possibilité peut être utilisée pour restaurer un timer provisoirement modifié. Le plus petit intervalle de temps ne peut être inférieur à la granularité de la machine : tv_usec > granule, information non trouvée au moment de la rédaction de ce document. En conséquence, toute opération plus courte qu'un granule n'est pas détectable par l'intermédiaire d'un timer.

Valeur retournée

    La fonction setitimer() renvoie 0 si l'appel s'est bien passé.

Diagnostic d'erreur

    La fonction setitimer() renvoie -1 en cas d'erreur. La variable globale errno est alors positionnée.