nanosleep(2) System Calls Manual nanosleep(2)

nanosleep - somn de înaltă rezoluție

Biblioteca C standard (libc, -lc)

#include <time.h>
int nanosleep(const struct timespec *duration,
              struct timespec *_Nullable rem);
Cerințe pentru macrocomenzi de testare a caracteristicilor pentru glibc (consultați feature_test_macros(7)):

nanosleep():

    _POSIX_C_SOURCE >= 199309L

nanosleep() suspendă execuția firului apelant până când se scurge cel puțin timpul specificat în *duration sau până la livrarea unui semnal care declanșează invocarea unui gestionar în firul apelant sau care termină procesul.

În cazul în care apelul este întrerupt de un gestionar de semnal, nanosleep() returnează -1, stabilește errno la EINTR și scrie timpul rămas în structura indicată de rem, cu excepția cazului în care rem este NULL. Valoarea lui *rem poate fi apoi utilizată pentru a apela din nou nanosleep() și pentru a finaliza pauza specificată (dar vedeți secțiunea NOTE).

Structura timespec(3) este utilizată pentru a specifica intervale de timp cu o precizie de o nanosecundă.

Valoarea câmpului nanosecunde trebuie să fie cuprinsă în intervalul [0, 999999999].

În comparație cu sleep(3) și usleep(3), nanosleep() are următoarele avantaje: oferă o rezoluție mai mare pentru specificarea intervalului de somn; POSIX.1 specifică în mod explicit că nu interacționează cu semnalele; și facilitează sarcina de reluare a unui somn care a fost întrerupt de un gestionar de semnal.

În cazul în care se reușește să doarmă pentru durata de timp solicitată, nanosleep() returnează 0. Dacă apelul este întrerupt de un gestionar de semnal sau întâmpină o eroare, atunci returnează -1, cu errno configurată pentru a indica eroarea.

ERORI-IEȘIRE

Problemă cu copierea informațiilor din spațiul utilizatorului.
Pauza a fost întreruptă de un semnal care a fost transmis firului (a se vedea signal(7)). Timpul de somn rămas a fost scris în *rem, astfel încât firul să poată apela din nou cu ușurință nanosleep() și să continue cu pauza.
Valoarea din câmpul tv_nsec nu era cuprinsă în intervalul [0, 999999999] sau tv_sec era negativă.

POSIX.1 specifică faptul că nanosleep() trebuie să măsoare timpul în raport cu ceasul CLOCK_REALTIME. Cu toate acestea, Linux măsoară timpul folosind ceasul CLOCK_MONOTONIC. Probabil că acest lucru nu contează, deoarece specificația POSIX.1 pentru clock_settime(2) spune că modificările discontinue în CLOCK_REALTIME nu ar trebui să afecteze nanosleep():

Fixarea valorii ceasului CLOCK_REALTIME prin clock_settime(2) nu are niciun efect asupra firelor care sunt blocate în așteptarea unui serviciu de timp relativ bazat pe acest ceas, inclusiv asupra funcției nanosleep(); ... În consecință, aceste servicii de cronometrare expiră la expirarea duratei solicitate, indiferent de valoarea nouă sau veche a ceasului.

POSIX.1-2008.

POSIX.1-2001.

Pentru a sprijini aplicațiile care necesită pauze mult mai precise (de exemplu, pentru a controla anumite echipamente hardware cu timp critic), nanosleep() ar putea gestiona pauze de până la 2 milisecunde prin așteptare ocupată cu precizie de microsecunde atunci când este apelat de un fir programat conform unei politici de timp real precum SCHED_FIFO sau SCHED_RR. Această extensie specială a fost eliminată în Linux 2.5.39 și, prin urmare, nu este disponibilă în Linux 2.6.0 și în nucleele ulterioare.

În cazul în care intervalul specificat în duration (durata) nu este un multiplu exact al granularității (fineții) ceasului de bază (a se vedea time(7)), atunci intervalul va fi rotunjit la următorul multiplu. În plus, după ce se termină somnul, este posibil să mai existe o întârziere până când CPU devine liber pentru a executa din nou firul de apelare.

Faptul că nanosleep() doarme pentru un interval relativ poate fi problematic dacă apelul este reluat în mod repetat după ce a fost întrerupt de semnale, deoarece timpul dintre întreruperi și reluarea apelului va duce la o derivă în momentul în care somnul se termină în cele din urmă. Această problemă poate fi evitată prin utilizarea clock_nanosleep(2) cu o valoare absolută a timpului.

Dacă un program care captează semnale și utilizează nanosleep() primește semnale la o rată foarte mare, atunci întârzierile de programare și erorile de rotunjire în calcularea de către nucleu a intervalului de somn și a valorii remain returnate înseamnă că valoarea remain poate crește constant la reporniri succesive ale apelului nanosleep(). Pentru a evita astfel de probleme, utilizați clock_nanosleep(2) cu fanionul TIMER_ABSTIME pentru a dormi la un termen limită absolut.

În Linux 2.4, dacă nanosleep() este oprit de un semnal (de exemplu, SIGTSTP), atunci apelul eșuează cu eroarea EINTR după ce firul este reluat de un semnal SIGCONT. Dacă apelul de sistem este repornit ulterior, atunci timpul pe care firul l-a petrecut în starea de oprire nu este contabilizat în intervalul de așteptare. Această problemă este rezolvată în Linux 2.6.0 și în nucleele ulterioare.

clock_nanosleep(2), restart_syscall(2), sched_setscheduler(2), timer_create(2), sleep(3), timespec(3), usleep(3), time(7)

Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.

2 mai 2024 Pagini de manual de Linux 6.8