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> ».