Skip to content
/linux-syscalls

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

ArchitectureNuméroABIPoint d'entrée
x86 (i386)162i386sys_nanosleep_time32
x64 (x86_64)35commonsys_nanosleep
ARM64 (aarch64)101——

Historique noyau

Introduit dans Linux 2.0.

  1. 2.0

    nanosleep() a été ajouté en 2.0 comme remplaçant haute résolution du sleep() à granularité seconde.

  2. 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) = 0

nanosleep() 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.

Syscalls liés