NOM
getitimer, setitimer - Lire/écrire la valeur d’une temporisation
SYNOPSIS
#include <sys/time.h>
int getitimer(int which, struct itimerval *curr_value);
int setitimer(int which, const struct itimerval *new_value,
struct itimerval *old_value);
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. Cette temporisation, utilisée
conjointement avec ITIMER_VIRTUAL, est généralement
utilisée 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 */
};
La fonction getitimer() renseigne la structure pointée par curr_value
avec le paramétrage de la temporisation indiqué par 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.
La fonction setitimer() positionne la temporisation avec les valeurs de
new_value. Si old_value n’est pas NULL, 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 court délai après la limite. Ce délai dépend de
la résolution de la temporisation système et de la charge du système ;
voir time(7) (mais consultez la section BOGUES ci‐dessous). À
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_VIRTUAL) 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.
VALEUR RENVOYÉE
En cas de réussite, zéro est renvoyé, sinon -1 est renvoyé et errno
contient le code d’erreur.
ERREURS
EFAULT new_value, old_value ou curr_value n’est pas un pointeur
correct.
EINVAL which n’est ni ITIMER_REAL, ni ITIMER_VIRTUAL, ni ITIMER_PROF ;
ou (depuis Linux 2.6.22) un des champs tv_usec dans la structure
pointée par new_value contient une valeur hors de l’intervalle 0
à 999 999.
CONFORMITÉ
POSIX.1-2001, SVr4, BSD 4.4 (cet appel est apparu dans BSD4.2).
POSIX.1-2008 marque getitimer() et setitimer() comme étant obsolètes,
en recommandant d’utiliser à la place l’API des temporisations POSIX
(timer_gettime(2), timer_settime(2), etc.).
NOTES
Un fils créé avec fork(2) n’hérite pas des temporisations périodiques
de son père. Les temporisations périodiques sont conservées au travers
d’un execve(2).
POSIX.1 laisse indéterminées les actions entre setitimer() et les trois
interfaces alarm(2), sleep(3) et usleep(3).
BOGUES
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.
Sous les noyaux Linux antérieurs au 2.6.16, les valeurs des
temporisations sont exprimées en « jiffies ». Si une temporisation est
initialisée à une valeur en jiffies dépassant la constante
MAX_SEC_IN_JIFFIES (définie dans include/linux/jiffies.h), la
temporisation est silencieusement tronquée à cette valeur maximale.
Sous Linux sur i386 (où, depuis Linux 2.6.13, un jiffy correspond par
défaut à 4 millisecondes), cela signifie que la valeur maximale d’une
temporisation est environ 99,42 jours. Depuis Linux 2.6.16, le noyau
utilise une représentation interne du temps différente et le plafond
est supprimé.
Sur certains systèmes (y compris i386), les noyaux Linux avant la
version 2.6.12 ont un bogue qui cause des expirations prématurées de
temporisation, avec une avance pouvant aller jusqu’à un jiffy dans
certaines circonstances. Ce bogue est corrigé dans Linux 2.6.12.
Selon POSIX.1-2001, setitimer() devrait échouer si la valeur de tv_usec
fournie n’est pas entre 0 et 999999. Cependant, dans les noyaux de
version inférieure ou égale à 2.6.21, Linux ne renvoie pas d’erreur, et
se contente d’ajuster la valeur de tv_sec correspondante. Depuis le
noyau 2.6.22, cette non conformité a été corrigée ; une valeur non
valable de tv_usec résulte en une erreur EINVAL.
VOIR AUSSI
gettimeofday(2), sigaction(2), signal(2), timer_create(2),
timerfd_create(2), time(7)
COLOPHON
Cette page fait partie de la publication 3.23 du projet man-pages
Linux. Une description du projet et des instructions pour signaler des
anomalies peuvent être trouvées à l’adresse
http://www.kernel.org/doc/man-pages/.
TRADUCTION
Cette page de manuel a été traduite et mise à jour par Christophe
Blaess <http://www.blaess.fr/christophe/> entre 1996 et 2003, puis par
Alain Portal <aportal AT univ-montp2 DOT fr> jusqu’en 2006, et mise à
disposition sur http://manpagesfr.free.fr/.
Les mises à jour et corrections de la version présente dans Debian sont
directement gérées par Julien Cristau <jcristau@debian.org> et l’équipe
francophone de traduction de Debian.
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document
en utilisant la commande « man -L C <section> <page_de_man> ».