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
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 de la façon suivante :
struct timespec { time_t tv_sec; /* secondes */ long tv_nsec; /* nanosecondes */ };
La valeur du champ nanoseconde 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.
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é n'est pas comptabilisé dans l'intervalle de sommeil.
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.
Ce document est une traduction réalisée par Christophe Blaess <http://www.blaess.fr/christophe/> le 14 octobre 1996 et révisée le 2 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 nanosleep ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.
Dernière mise à jour : 2 juillet 2008