NANOSLEEP(2)

NOM
nanosleep - Arrêter l'exécution pendant une durée donnée

SYNOPSIS
#define _POSIX_C_SOURCE 199309 #include <time.h>

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

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

nanosleep() : _POSIX_C_SOURCE >= 199309L

DESCRIPTION
nanosleep() suspend l'exécution du programme en cours pour une durée valant au moins *req. Cette fonction peut se terminer plus tôt que prévu si un signal a été reçu par le processus. Dans ce cas, elle renvoie -1, remplit 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. La structure timespec est utilisée pour indiquer l'intervalle de temps en nano-secondes. Elle est définie dans <time.h> et a la forme suivante

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

La valeur du champ nano-seconde doit être dans l'intervalle 0 à 999 999 999. Par rapport à sleep(3) et usleep(3), nanosleep() a l'avantage de n'affecter aucun signal, d'être au standard POSIX, de fournir une meilleure résolution, et de permettre de continuer facilement un sommeil interrompu par un signal.

VALEUR RENVOYÉE
S'il s'endort de manière réussie pendant l'intervalle de temps demandé En cas d'erreur ou d'interruption, l'appel système nanosleep() renvoie 0. Si l'appel est interrompu par un gestionnaire de signaux ou rencontre une erreur, il renvoie -1 et écrit errno en conséquence.

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 processus. Le temps restant de sommeil a été inscrit dans *rem pour que le processus puisse terminer facilement son sommeil.

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.

BOGUES
L'implémentation actuelle de nanosleep() est construite sur le mécanisme de temporisation du noyau, qui dispose d'une résolution valant 1/HZ s (voir time(7))). Ainsi, nanosleep() dormira toujours pour une durée au moins égale au temps spécifié, mais il peut prendre jusqu'à 10 ms de plus (i386) avant de faire redémarrer le processus. Pour la même raison, la valeur retournée dans *rem en cas d'interruption par un signal est arrondie au multiple supérieur de 1/HZ s.

  Ancien comportement
Afin de pouvoir supporter 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() pouvait aussi offrir des pauses jusqu'à 2 ms, effectuées avec des boucles actives d'une précision de l'ordre de la micro-seconde, lorsque le processus était mis sous le contrôle d'un ordonnanceur temps réel comme SCHED_FIFO ou SCHED_RR. Cette extension particulière a été retiré dans le noyau 2.5.39. Elle est donc toujours présence dans les noyaux 2.4, mais plus dans les noyaux 2.6.

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 processus ait repris avec un signal SIGCONT. Si l'appel système est, par la suite, relancé, le temps passé par le processus dans l'état arrêté n'est pas comptabilisé dans l'intervalle de sommeil.

VOIR AUSSI
sched_setscheduler(2), sleep(3), timer_create(3), usleep(3), time(7)

TRADUCTION

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 22 décembre 2007.

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.