clock_nanosleep(2)

NUME
clock_nanosleep - repaus(somn) de înaltă rezoluție cu ceas specificabil

BIBLIOTECA
Biblioteca C standard (libc, -lc), începând cu glibc 2.17

Înainte de glibc 2.17, biblioteca în timp real (librt, -lrt)

SINOPSIS
#include <time.h>

int clock_nanosleep(clockid_t clockid, int flags,
                    const struct timespec *t,
                    struct timespec *_Nullable remain);

    Cerințe pentru macrocomenzi de testare a caracteristicilor pentru glibc (consultați feature_test_macros(7)):

clock_nanosleep():
    _POSIX_C_SOURCE >= 200112L

DESCRIERE
Ca și nanosleep(2), clock_nanosleep() permite firului apelant să doarmă pentru un interval specificat cu precizie de nanosecunde. Acesta diferă prin faptul că permite apelantului să selecteze ceasul în raport cu care urmează să fie măsurat intervalul de somn și prin faptul că intervalul de somn poate fi specificat ca valoare absolută sau relativă.

Valorile de timp transmise și returnate de acest apel sunt specificate folosind structurile timespec(3).

Argumentul clockid specifică ceasul în raport cu care urmează să fie măsurat intervalul de somn. Acest argument poate avea una dintre următoarele valori:

CLOCK_REALTIME
    Un ceas în timp real reglabil la nivelul întregului sistem.

CLOCK_TAI (începând cu Linux 3.10)
    Un ceas la nivel de sistem derivat din ceasul etalon, dar care numără secundele bisecte.

CLOCK_MONOTONIC
    Un ceas neconfigurabil, cu creștere monotonă, care măsoară timpul de la un moment nespecificat în trecut și care nu se modifică după pornirea sistemului.

CLOCK_BOOTTIME (începând cu Linux 2.6.39)
    Identic cu CLOCK_MONOTONIC, cu excepția faptului că include și timpul în care sistemul este suspendat.

CLOCK_PROCESS_CPUTIME_ID
    Un ceas configurabil per proces care măsoară timpul CPU consumat de toate firele din proces.

Consultați clock_getres(2) pentru detalii suplimentare privind aceste ceasuri. În plus, ID-urile ceasurilor CPU returnate de clock_getcpuclockid(3) și pthread_getcpuclockid(3) pot fi transmise și în clockid.

Dacă flags este 0, atunci valoarea specificată în t este interpretată ca un interval relativ la valoarea curentă a ceasului specificat de clockid.

Dacă flags este TIMER_ABSTIME, atunci t este interpretat ca un timp absolut măsurat de ceas, clockid. Dacă t este mai mic sau egal cu valoarea curentă a ceasului, atunci clock_nanosleep() revine imediat fără a suspenda firul apelant.

clock_nanosleep() suspendă execuția firului de execuție apelant până când fie a trecut cel puțin timpul specificat de t, fie este transmis un semnal care determină apelarea unui gestionar de semnal sau terminarea procesului.

Dacă apelul este întrerupt de un gestionar de semnal, clock_nanosleep() eșuează cu eroarea EINTR. În plus, dacă remain nu este NULL, iar flags nu a fost TIMER_ABSTIME, se returnează timpul rămas nedormit în remain. Această valoare poate fi apoi utilizată pentru a apela din nou clock_nanosleep() și a finaliza un somn (relativ).

VALOAREA RETURNATĂ
După ce a reușit să doarmă pentru intervalul solicitat, clock_nanosleep() returnează 0. Dacă apelul este întrerupt de un gestionar de semnal sau detectează o eroare, atunci returnează unul dintre numerele de eroare pozitive enumerate în ERORI-IEȘIRE.

ERORI-IEȘIRE

EFAULT
    t sau remain a specificat o adresă nevalidă.

EINTR
    Somnul a fost întrerupt de un gestionar de semnal; a se vedea signal(7).

EINVAL
    Valoarea din câmpul tv_nsec nu era cuprinsă în intervalul [0, 999999999] sau tv_sec era negativă.

EINVAL
    clockid nu a fost valid. CLOCK_THREAD_CPUTIME_ID nu este o valoare permisă pentru clockid.

ENOTSUP
    Nucleul nu oferă suport pentru dormitul în raport cu acest clockid.

STANDARDE
POSIX.1-2024.

ISTORIC
POSIX.1-2001. Linux 2.6, glibc 2.1.

NOTE
Dacă intervalul specificat în t nu este un multiplu exact al gradului de finețe care stă la baza ceasului (a se vedea time(7)), atunci intervalul va fi rotunjit la următorul multiplu. În plus, după finalizarea somnului, poate exista încă o întârziere până când CPU devine liber să execute din nou firul apelant.

Utilizarea unui temporizator absolut este utilă pentru prevenirea problemelor de derivă a temporizatorului de tipul celor descrise în nanosleep(2). Astfel de probleme sunt exacerbate în programele care încearcă să repornească un somn relativ care este întrerupt în mod repetat de semnale. Pentru a efectua un somn relativ care evită aceste probleme, apelați clock_gettime(2) pentru ceasul dorit, adăugați intervalul dorit la valoarea de timp returnată și apoi apelați clock_nanosleep() cu fanionul TIMER_ABSTIME.

clock_nanosleep() nu este niciodată repornit după ce a fost întrerupt de un gestionar de semnal, indiferent de utilizarea fanionului sigaction(2) SA_RESTART.

Argumentul remain este neutilizat și inutil atunci când flags este TIMER_ABSTIME; (un somn absolut poate fi repornit folosind același argument t).

POSIX.1 specifică faptul că clock_nanosleep() nu are niciun efect asupra dispozițiilor semnalelor sau a măștii de semnal.

POSIX.1 specifică faptul că, după modificarea valorii ceasului CLOCK_REALTIME prin clock_settime(2), noua valoare a ceasului este utilizată pentru a determina momentul la care se va trezi un fir de execuție blocat pe un apel absolut clock_nanosleep(); dacă noua valoare a ceasului depășește sfârșitul intervalului de somn, apelul clock_nanosleep() va reveni imediat.

POSIX.1 specifică faptul că modificarea valorii ceasului CLOCK_REALTIME prin clock_settime(2) nu are niciun efect asupra unui fir care este blocat pe un clock_nanosleep() relativ.

CONSULTAȚI ȘI
clock_getres(2), nanosleep(2), restart_syscall(2), timer_create(2), sleep(3), timespec(3), usleep(3), time(7)

TRADUCERE
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 (https://www.gnu.org/licenses/gpl-3.0.html) 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.