table of contents
- bookworm-backports 4.26.0-1~bpo12+1
- testing 4.26.0-1
- unstable 4.26.0-1
clock_nanosleep(2) | System Calls Manual | 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 *request, struct timespec *_Nullable remain);
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 ignoră 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 request este interpretată ca un interval relativ la valoarea curentă a ceasului specificat de clockid.
Dacă flags este TIMER_ABSTIME, atunci request este interpretat ca un timp absolut măsurat de ceas, clockid. Dacă request 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 fie până când se scurge cel puțin timpul specificat de request, fie până când este emis un semnal care determină apelarea unui gestionar de semnal sau care pune capăt 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
- request 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.
VERSIUNI¶
Apelul de sistem clock_nanosleep() a apărut pentru prima dată în Linux 2.6. Suportul este disponibil începând cu glibc 2.1.
STANDARDE¶
POSIX.1-2001, POSIX.1-2008.
NOTE¶
Dacă intervalul specificat în request 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 request).
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 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.
12 februarie 2023 | Pagini de manual de Linux 6.03 |