nanosleep(2) System Calls Manual nanosleep(2) NOM nanosleep - Sommeil en haute resolution BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include int nanosleep(const struct timespec *req, struct timespec *_Nullable rem); Exigences de macros de test de fonctionnalites pour la glibc (consulter feature_test_macros(7)) : nanosleep(): _POSIX_C_SOURCE >= 199309L DESCRIPTION nanosleep() suspend l'execution du thread appelant jusqu'a ce que le temps indique dans *req ait expire, ou que la reception d'un signal ait declenche l'invocation d'un gestionnaire dans le thread appelant ou ait termine 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 pointee par rem a moins que rem soit NULL. La valeur de *rem peut etre utilisee pour rappeler a nouveau nanosleep() afin de terminer la pause (mais voir la section NOTES plus loin). La structure timespec est utilisee pour indiquer l'intervalle de temps en nanosecondes. La valeur du champ nanosecondes doit etre dans l'intervalle [0 a 999 999 999]. Par rapport a sleep(3) et usleep(3), nanosleep() a les avantages suivants : il fournit une meilleure resolution pour indiquer la duree 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 RENVOYEE L'appel nanosleep() renvoie 0 s'il reussit a suspendre l'execution pour la duree demandee. 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 Probleme lors de la copie d'information a partir de l'espace utilisateur. EINTR La pause a ete interrompue par un signal delivre au thread (voir signal(7)). Le temps restant de sommeil a ete 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 a 999 999 999 ou tv_sec est negatif. VERSIONS 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 specification POSIX.1 de clock_settime(2) indique que les modifications discontinues dans CLOCK_REALTIME n'affectent pas nanosleep() : Configurer la valeur de l'horloge CLOCK_REALTIME avec clock_settime(2) ne doit pas avoir d'effet sur les threads bloques attendant un service de temps relatif base sur cette horloge. Cela inclut la fonction nanosleep() ; ... En consequence, ces services de temps doivent expirer lorsque la duree relative demandee est atteinte, independamment de l'ancienne ou la nouvelle valeur de l'horloge. STANDARDS POSIX.1-2008. HISTORIQUE POSIX.1-2001. Pour gerer des applications necessitant des pauses plus precises (par exemple pour le controle de peripheriques materiels avec un delai critique), nanosleep() prend en charge des pauses jusqu'a 2 millisecondes, en etant occupe avec une precision d'une microseconde lorsqu'il est appele a partir d'un thread ordonnance par une politique en temps reel comme SCHED_FIFO ou SCHED_RR. Cette extension speciale a ete supprimee dans Linux 2.5.39, et n'est donc plus disponible dans les noyaux 2.6.0 et superieur. NOTES Si l'intervalle indique dans req n'est pas un multiple exact de la granularite de l'horloge sous-jacente (consultez time(7)), l'intervalle est arrondi au multiple superieur. De plus, apres que le sommeil est acheve, il y a toujours un delai avant que le processeur ne redevienne completement disponible pour le thread appelant. Le fait que nanosleep() endorme pour une duree relative peut etre problematique si l'appel est relance de maniere repetee apres avoir ete interrompu par des signaux, puisque le temps entre les interruptions et les redemarrages de l'appel connaitra une derive lorsque le sommeil sera finalement acheve. Ce probleme peut etre evite en utilisant clock_nanosleep(2) avec une valeur de temps absolu. BOGUES Si un programme captant les signaux et utilisant nanosleep() recoit des signaux a tres haute vitesse, les delais d'ordonnancement et les erreurs d'arrondi de calcul par le noyau de l'intervalle de sommeil et de la valeur de retour remain signifient que la valeur de remain peut augmenter regulierement au cours des redemarrages successifs de l'appel nanosleep(). Pour eviter de tels problemes, utilisez clock_nanosleep(2) avec l'attribut TIMER_ABSTIME pour un sommeil d'une duree absolue. Dans Linux 2.4, si nanosleep() est arrete par un signal (par exemple, SIGTSTP), l'appel echoue avec l'erreur EINTR apres que le thread a repris avec un signal SIGCONT. Si l'appel systeme est, par la suite, relance, le temps passe par le thread dans l'etat arrete n'est pas comptabilise dans l'intervalle de sommeil. Ce probleme est corrige dans les noyaux Linux 2.6.0 et superieurs. VOIR AUSSI clock_nanosleep(2), restart_syscall(2), sched_setscheduler(2), timer_create(2), sleep(3), timespec(3), usleep(3), time(7) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot et Jean-Philippe MENGUAL Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 31 octobre 2023 nanosleep(2)