nanosleep
Table des matières
Retour à l'index
NOM
nanosleep - Sommeil en haute résolution
BIBLIOTHÈQUE
Bibliothèque C standard (libc, -lc)
SYNOPSIS
#include <time.h>
int nanosleep(const struct timespec *durée,
struct timespec *_Nullable rem);
Exigences de macros de test de fonctionnalités pour la glibc (consulter
feature_test_macros(7)) :
nanosleep():
_POSIX_C_SOURCE >= 199309L
DESCRIPTION
nanosleep() suspend l'exécution du thread appelant jusqu'à ce que le
temps indiqué dans *durée 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.
La valeur du champ nanosecondes doit être dans l'intervalle [0 à 999 999 999].
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 délivré au thread (voir
signal(7)). 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.
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
spécification 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 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 demandée est atteinte, indépendamment de l'ancienne ou la
nouvelle valeur de l'horloge.
STANDARDS
POSIX.1-2008.
HISTORIQUE
POSIX.1-2001.
Pour gérer des 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() prend en charge des pauses jusqu'à 2 millisecondes, en étant
occupé avec une précision d’une microseconde lorsqu'il est appelé à partir
d'un thread ordonnancé par une politique en temps réel comme SCHED_FIFO
ou SCHED_RR. Cette extension spéciale a été supprimée dans Linux 2.5.39,
et n'est donc plus disponible dans les noyaux 2.6.0 et supérieur.
NOTES
Si la durée n'est pas un multiple exact de la granularité de l'horloge
sous-jacente (consultez time(7)), l'intervalle est arrondi au multiple
supérieur. De plus, après que le sommeil est 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.
BOGUES
Si un programme captant les signaux et utilisant nanosleep() reçoit des
signaux à très haute vitesse, les délais 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
régulièrement au cours des redémarrages successifs de l'appel
nanosleep(). Pour éviter de tels problèmes, utilisez
clock_nanosleep(2) avec l'attribut TIMER_ABSTIME pour un sommeil d'une
durée absolue.
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 a
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é n'est pas
comptabilisé dans l'intervalle de sommeil. Ce problème est corrigé dans les
noyaux Linux 2.6.0 et supérieurs.
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 française de cette page de manuel a été créée par
Christophe Blaess <https://www.blaess.fr/christophe/>,
Stéphan Rafin <stephan.rafin@laposte.net>,
Thierry Vignaud <tvignaud@mandriva.com>,
François Micaux,
Alain Portal <aportal@univ-montp2.fr>,
Jean-Philippe Guérard <fevrier@tigreraye.org>,
Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>,
Julien Cristau <jcristau@debian.org>,
Thomas Huriaux <thomas.huriaux@gmail.com>,
Nicolas François <nicolas.francois@centraliens.net>,
Florentin Duneau <fduneau@gmail.com>,
Simon Paillard <simon.paillard@resel.enst-bretagne.fr>,
Denis Barbier <barbier@debian.org>,
David Prévot <david@tilapin.org>
et
Jean-Philippe MENGUAL <jpmengual@debian.org>
Cette traduction est une documentation libre ; veuillez vous reporter à la
GNU General Public License version 3
concernant les conditions de copie et
de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel,
veuillez envoyer un message à
Index
- NOM
-
- BIBLIOTHÈQUE
-
- SYNOPSIS
-
- DESCRIPTION
-
- VALEUR RENVOYÉE
-
- ERREURS
-
- VERSIONS
-
- STANDARDS
-
- HISTORIQUE
-
- NOTES
-
- BOGUES
-
- VOIR AUSSI
-
- TRADUCTION
-
This document was created by
man2html,
using the manual pages.
Time: 05:06:03 GMT, September 19, 2025