GETITIMER(2)

NOM
getitimer, setitimer - Lire/écrire la valeur d'une temporisation

SYNOPSIS
#include <sys/time.h>

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

DESCRIPTION
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 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. La fonction setitimer() positionne la temporisation avec les valeurs de value. Si ovalue 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, mais un court délai après. Ce délai dépend de la résolution de la temporisation système et de la charge du système ; voir time(7). (Voir la section BOGUES plus loin.) À 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
Ces appels système renvoient 0 s'ils réussissent, ou -1 s'ils échouent, auquel cas errno est renseignée en conséquence.

ERREURS

EFAULT
    value ou ovalue pointent en dehors de l'espace d'adressage accessible.

EINVAL
    which n'est ni ITIMER_REAL, ni ITIMER_VIRTUAL, ni ITIMER_PROF ; ou (depuis Linux 2.6.22) un des champs tv_usec contient une valeur hors de l'intervalle 0 à 999999.

CONFORMITÉ
POSIX.1-2001, SVr4, BSD 4.4 (Cet appel est apparu dans BSD 4.2).

NOTES
Un fils créé avec fork(2) n'hérite pas des temporisations périodiques de son père. Les temporisations périodiques sont préservées au travers d'un execve(2). POSIX.1 laisse indéterminées les actions entre setitimer() et les interfaces alarm(2), sleep(3) et usleep(3).

BOGUES
Sous Linux, l'émission et la réception d'un signal sont distincts, et une seule instance de chacun des signaux listés plus haut n'est permise pour un processus. Avec une charge système très élevée, une temporisation ITIMER_REAL peut expirer 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 on tente de configurer une temporisation avec une valeur dont la représentation en jiffies excède MAX_SEC_IN_JIFFIES (définie dans <include/linux/jiffies.h>), la temporisation est silencieusement tronquée à sa valeur plafond. 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 approximativement de 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 (i386 inclus), les noyaux Linux antérieurs à la version 2.6.12 avaient un bogue qui produit, dans certaines circonstances, des expirations prématurées des temporisations jusqu'à 1 jiffy. Ce bogue a été corrigé dans Linux 2.6.12 Selon POSIX.1-2001, setitimer() devrait échouer si une valeur tv_usec est spécifiée en dehors de l'intervalle 0 à 999999. Toutefois, dans les noyaux jusqu'au 2.6.21 inclus, Linux ne produit pas d'erreur mais ajuste silencieusement la valeur correspondante pour la temporisation. À partir de Linux 2.6.22, cette non-conformité a été corrigée : une valeur tv_usec incorrecte provoquera une erreur EINVAL.

VOIR AUSSI
gettimeofday(2), sigaction(2), signal(2), timerfd_create(2), time(7)

TRADUCTION

Ce document est une traduction réalisée par Christophe Blaess <http://www.blaess.fr/christophe/> le 11 octobre 1996 et révisée le 17 juillet 2008.

L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 2 getitimer ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.