Loading

NOM

       nanosleep - Sommeil en haute résolution

SYNOPSIS

       #include <time.h>

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

   Exigences  de  macros  de  test  de  fonctionnalités  pour  la  glibc (voir
   feature_test_macros(7)) :

       nanosleep() : _POSIX_C_SOURCE >= 199309L

       nanosleep() suspend l’exécution du thread appelant jusqu’à  ce  que  le
       temps indiqué dans *req ait expiré, ou que la réception d’un signal ait
       déclenché l’invocation d’un gestionnaire dans le thread appelant ou ait
       terminé le processus.

       Si  l’appel  est  interrompu  par un gestionnaire de signal nanosleep()
       renvoie -1, renseigne errno avec la valeur EINTR, et inscrit  le  temps
       restant dans la structure pointée par rem à moins que rem soit NULL. La
       valeur de *rem peut être utilisée pour rappeler à  nouveau  nanosleep()
       afin de terminer la pause (mais voir la section NOTES plus loin).

       La  structure timespec est utilisée pour indiquer l’intervalle de temps
       en nanosecondes. Elle est définie comme ceci :

           struct timespec {
               time_t tv_sec;        /* secondes     */
               long   tv_nsec;       /* nanosecondes */
           };

       La valeur du  champ  nanosecondes  doit  être  dans  l’intervalle  0  à
       999 999999.

       Par  rapport  à  sleep(3)  et  usleep(3),  nanosleep()  a les avantages
       suivants : il fournit une meilleure résolution pour indiquer  la  durée
       du sommeil ; POSIX.1 indique explicitement qu’il n’interagit avec aucun
       signal ; il permet enfin de continuer facilement un sommeil  interrompu
       par un signal.

VALEUR RENVOYÉE

       L’appel nanosleep() renvoie 0 s’il réussit à suspendre l’exécution pour
       la durée demandée. Si l’appel est interrompu  par  un  gestionnaire  de
       signal ou rencontre une erreur, il renvoie -1 et errno contient le code
       d’erreur.

ERREURS

       EFAULT Problème lors de la copie d’information  à  partir  de  l’espace
              utilisateur.

       EINTR  La  pause  a été interrompue par un signal non bloqué délivré au
              thread. Le temps restant de sommeil a été inscrit dans *rem pour
              que   le  thread  puisse  terminer  facilement  son  sommeil  en
              rappelant nanosleep().

       EINVAL La valeur du champ tv_nsec  n’est  pas  dans  l’intervalle  0  à
              999 999 999 ou tv_sec est négatif.

CONFORMITÉ

       POSIX.1-2001.

NOTES

       Si  l’intervalle  indiqué  dans  req  n’est pas un multiple exact de la
       granularité de l’horloge sous-jacente (voir time(7)), l’intervalle  est
       arrondi  au  multiple  supérieur.  De  plus,  après que le sommeil soit
       achevé, il y a toujours un délai avant que le processeur ne  redevienne
       complètement disponible pour le thread appelant.

       Le  fait  que  nanosleep()  endorme  pour  une durée relative peut être
       problématique si l’appel est relancé de manière répétée après avoir été
       interrompu par des signaux, puisque le temps entre les interruptions et
       les redémarrages de l’appel connaîtra une  dérive  lorsque  le  sommeil
       sera  finalement  achevé.  Ce  problème  peut  être  évité en utilisant
       clock_nanosleep(2) avec une valeur de temps absolu.

       POSIX.1 indique que nanosleep() doit mesurer le  temps  avec  l’horloge
       CLOCK_REALTIME.   Pourtant,   Linux  mesure  le  temps  avec  l’horloge
       CLOCK_MONOTONIC.  Cela  n’a  probablement  pas  d’importance   car   la
       spécification  POSIX.1 de clock_settime() indique que les modifications
       discontinues dans CLOCK_REALTIME n’affectent pas nanosleep() :

              Configurer  la   valeur   de   l’horloge   CLOCK_REALTIME   avec
              clock_settime()  ne  doit  pas  avoir  d’effet  sur  les threads
              bloqués attendant un service de temps  relatif  basé  sur  cette
              horloge.   Cela   inclut   la   fonction   nanosleep() ;   ...En
              conséquence, ces services de temps doivent  expirer  lorsque  la
              durée   relative   demandée   est  atteinte,  indépendamment  de
              l’ancienne ou la nouvelle valeur de l’horloge.

   Ancien comportement
       Certaines  applications  nécessitant  des  pauses  plus  précises  (par
       exemple  pour  le  contrôle  de  périphériques  matériels avec un délai
       critique), nanosleep() peut aussi offrir des pauses avec une  précision
       plus  élevée.  Si  le  thread  est mis sous le contrôle d’une politique
       d’ordonnancement temps réel comme SCHED_FIFO ou  SCHED_RR,  les  pauses
       jusqu’à 2 ms seront effectuées avec des boucles actives d’une précision
       de l’ordre de la microseconde. Cette extension spéciale a été supprimée
       dans  le  noyau  2.5.39,  et est donc toujours présente dans les noyaux
       2.4, mais pas dans les noyaux 2.6.

BOGUES

       Dans Linux 2.4, si nanosleep() est arrêté par un signal  (par  exemple,
       SIGTSTP),  l’appel  échoue  avec l’erreur EINTR après que le thread ait
       repris avec un signal SIGCONT. Si l’appel système est,  par  la  suite,
       relancé,  le  temps  passé  par  le thread dans l’état arrêté nest pas
       comptabilisé dans l’intervalle de sommeil.

VOIR AUSSI

       clock_nanosleep(2), sched_setscheduler(2),  sleep(3),  timer_create(2),
       usleep(3), 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> ».