Temps & Horloges · Section 2
nanosleep(2)
Suspend le thread appelant pour la durée indiquée avec précision nanoseconde.
Signature
#include <time.h>
int nanosleep(const struct timespec * req, struct timespec * rem);- req
- Durée demandée. tv_sec en secondes, tv_nsec en fraction nanoseconde dans [0, 999_999_999].
- rem
- Si non-NULL et l'appel est interrompu, reçoit la durée non écoulée. NULL si pas besoin de relance EINTR.
Description
nanosleep() suspend le thread appelant pour au moins le temps indiqué dans *req — une struct timespec avec secondes et nanosecondes. Utilise CLOCK_MONOTONIC, donc non affectée par les ajustements d'horloge murale (NTP, settimeofday). Si interrompue par un signal sans SA_RESTART, l'appel retourne -1/EINTR et écrit la durée restante dans *rem (si non-NULL) — l'appelant peut réessayer avec rem pour compléter la durée originale. Retourne 0 à complétion. Le noyau arrondit à la granularité de l'horloge système ; les noyaux high-resolution timer honorent jusqu'à ~1 µs. Pour des sommeils en temps absolu ou pour s'éveiller sur CLOCK_REALTIME avec sémantique de fuseau, utiliser clock_nanosleep() — il prend un id d'horloge explicite et un drapeau TIMER_ABSTIME.
Numéros par architecture
| Architecture | Numéro | ABI | Point d'entrée |
|---|---|---|---|
| x86 (i386) | 162 | i386 | sys_nanosleep_time32 |
| x64 (x86_64) | 35 | common | sys_nanosleep |
| ARM64 (aarch64) | 101 | — | — |
Historique noyau
Introduit dans Linux 2.0.
2.0
nanosleep() a été ajouté en 2.0 comme remplaçant haute résolution du sleep() à granularité seconde.
2.6.21
clock_nanosleep() a été ajouté pour qu'une application dorme contre une horloge précise (CLOCK_MONOTONIC, CLOCK_REALTIME, CLOCK_BOOTTIME), et avec TIMER_ABSTIME pour dormir jusqu'à un instant horloge murale — éliminant la dérive cumulée des boucles requête → sommeil → continuation.
seccomp & conteneurs
Docker default profile
Autorisé
Podman default profile
Autorisé
nanosleep() et clock_nanosleep() sont dans tout profil par défaut. Les bloquer casserait essentiellement tout programme — le sleep est trop fondamental. Pas de filtrage d'arguments utile.
libseccomp
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(nanosleep), 0);
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(clock_nanosleep), 0);Exemple strace
$ strace -e nanosleep sleep 0.05
nanosleep({tv_sec=0, tv_nsec=50000000}, NULL) = 0nanosleep() dans strace affiche la struct timespec décodée. -r ajoute des annotations de temps relatif pour comparer l'écoulement réel à la requête. Les programmes à latence inexpliquée ont souvent un nanosleep() accidentel dans une boucle chaude — strace -c le révèle comme >100% du temps en nanosleep().
Sécurité & observabilité
nanosleep() est rarement un signal défensif mais deux motifs sont à connaître : (1) Les malwares anti-sandbox dorment des minutes ou heures au démarrage pour dépasser les sandboxes d'analyse dynamique — un long nanosleep() en début de processus est un drapeau rouge classique pour les classificateurs comportementaux. (2) Les attaques de timing par force brute ou canal auxiliaire se calibrent avec nanosleep() entre sondes. Le tracepoint eBPF sys_enter_nanosleep avec tv_sec élevé est un flux de télémétrie peu coûteux. Pour les charges bénignes, nanosleep() n'est que du bruit.
Erreurs
- EFAULT
- Pointeur req ou rem invalide.
- EINTR
- Interrompu par un signal. *rem porte la portion restante ; boucler sur EINTR pour la durée totale.
- EINVAL
- tv_nsec hors plage, ou tv_sec négatif.