Linux |
CentOS 4.8 |
|
setitimer(2) |
getitimer, setitimer − Lire / écrire la valeur d’une temporisation. |
#include <sys/time.h> |
int getitimer(int which, struct itimerval *value); |
int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue); |
Le système fournit pour chaque processus trois temporisations, chacune avec un fonctionnement particulier. Lorsqu’une temporisation expire, un signal est envoyé au processus et la temporisation redémarre éventuellement. |
ITIMER_REAL |
décroît en temps réel et un signal SIGALRM est émis à l’expiration du délai. |
||
ITIMER_VIRTUAL |
décroît uniquement quand le processus s’exécute, et un signal SIGVTALRM est émis à l’expiration du délai. |
||
ITIMER_PROF |
décroît à la fois quand le processus s’exécute, et quand le processeur exécute des fonctions systèmes à la demande du processus. Ce timer, utilisé conjointement avec ITIMER_VIRTUAL, est généralement utilisé pour obtenir le profil d’exécution du processus entre les fonctionnalités utilisateur et le noyau. SIGPROF est émis à l’expiration du délai. |
Les valeurs des temporisations sont définies avec les structures suivantes : |
struct itimerval { struct timeval it_interval; /* valeur suivante */ struct timeval it_value; /* valeur actuelle */ }; struct timeval { long tv_sec; /* secondes */ long tv_usec; /* micro secondes */ }; |
Getitimer(2) renseigne la structure pointée par value avec le paramétrage de la temporisation which (parmi ITIMER_REAL, ITIMER_VIRTUAL, ou ITIMER_PROF). L’élément it_value est rempli avec le délai restant dans la temporisation, ou zéro si la temporisation est désactivée. De même it_interval sera rempli avec la valeur originale de la temporisation. Setitimer(2) positionne la temporisation avec les valeurs de value. Si ovalue est non nulle, les paramètres précédents de la temporisation y sont inscrits. Les temporisations décroissent de it_value à zéro, déclenchent un signal, et sont replacées à it_interval. Une temporisation s’arrête si elle est mise à zéro (it_value vaut zéro) ou bien elle expire et it_interval vaut zéro. Les deux champs tv_sec et tv_usec sont utilisés pour déterminer la durée d’une temporisation. Les temporisations n’expirent jamais avant la fin du temps requis, et expirent plutôt avec un délai court et constant après la limite. Ce délai dépend de la résolution du timer système (actuellement 10 ms). A l’expiration un signal est déclenché puis la temporisation réinitialisée. Si la temporisation expire alors que le processus est actif (toujours vrai avec ITIMER_VIRT) le signal sera délivré immédiatement. Autrement il y aura un petit délai avant réception du signal, dépendant de la charge du système. |
getitimer et setitimer renvoient 0 s’ils réussissent, ou −1 s’ils échouent, auquel cas errno contient le code d’erreur. |
EFAULT |
value ou ovalue pointent en dehors de l’espace d’adressage accessible. |
||
EINVAL |
which n’est pas dans la liste ITIMER_REAL, ITIMER_VIRT, ou ITIMER_PROF. |
SVr4, 4.4BSD (Cet appel est apparu dans 4.2BSD). |
gettimeofday(2), sigaction(2), signal(2). |
Sous Linux, l’émission et la réception d’un signal sont distincts, et un même signal ne peut pas être émis deux fois de suite si le premier n’a pas été reçu. Il est ainsi possible qu’avec une charge système très élevée, une temporisation ITIMER_REAL expire avant que le signal d’une expiration précédente n’ait été reçu. Le second signal sera alors perdu. |
Christophe Blaess, 1997. |
setitimer(2) |