Man clock_gettime (2) funcții de ceas și timp

int clock_getres (clockid_tclk_id, struct timepec * res);

int ceas_gettime (clockid_tclk_id, struct timespec * tp);

int ceas_settime (clockid_tclk_id, const struct timepec * tp);







Se compilează atunci când se specifică parametrul -lrt (numai pentru glibc până la versiunea 2.17).

Cerințele macrocomenzi de test proprietate pentru glibc (a se vedea feature_test_macros (7)):

clock_getres (), clock_gettime (), clock_settime ():

Funcția clock_getres () specifică rezoluția (precizia) orelor specificate în clk_id, iar dacă res nu este NULL, o stochează într-un struct timepec. specificată în rez. Precizia ceasului depinde de implementare și nu poate fi configurată printr-un anumit proces. Dacă valoarea de timp specificată în argumentul tp al clock_settime () nu este un multiplu de res. atunci este trunchiată la un rezumat multiple.

Funcțiile clock_gettime () și clock_settime () primesc și setează timpul orelor specificate clk_id.

Argumentele res și tp reprezintă structura timepec. definite în .

Argumentul clk_id reprezintă identificatorul anumitor ore în care se efectuează acțiunea. Ceasul poate fi utilizat de sistem ca un întreg și, prin urmare, este vizibil pentru toate procesele sau un anumit proces dacă acestea numără timpul doar într-un singur proces.

Toate implementările suportă ceasul de sistem în timp real, care are un identificator CLOCK_REALTIME. Timpul lor este reprezentat în secunde și nanosecunde de la începutul Epocii. Atunci când timpul lor se schimbă, nu are nici un efect asupra cronometrelor cu intervale relative, dar cronometrele cu un punct absolut în timp iau acest lucru în considerare.

Poate fi realizat mai multe ore. Reprezentarea valorilor de timp corespunzătoare și efectul asupra cronometrelor este nedefinită.

În cele mai recente versiuni ale glibc și kernel-ului Linux sunt suportate următoarele ore:

CLOCK_REALTIME Ceasul de sistem, care numără timpul real (de exemplu, de uz casnic). Pentru a configura aceste ore, aveți nevoie de permisiunile corespunzătoare. Aceste ore sunt supuse timpul sistemului sare (de exemplu, în cazul în care administratorul de sistem se schimbă ora manual), iar decupajul treptată realizată de adjtime (3) și NTP. CLOCK_REALTIME_COARSE (de când Linux 2.6.32; disponibil numai pe Linux) O versiune mai rapidă dar mai puțin exactă a CLOCK_REALTIME. Utilizați dacă nu aveți nevoie de o ștampilă de timp foarte precisă, dar rapid. CLOCK_MONOTONIC Un ceas care nu poate fi configurat și prezintă un curs de timp monoton contorizat cu un punct de plecare nedefinit. Aceste ceasuri nu sunt supuse sistemului de timp sare (de exemplu, un administrator de sistem modificat manual ora), dar ele sunt influențate de o ajustare graduală efectuată de adjtime (3) și NTP. CLOCK_MONOTONIC_COARSE (de la Linux 2.6.32; disponibil numai pe Linux) O versiune mai rapidă, dar mai puțin precisă a CLOCK_MONOTONIC. Utilizați dacă nu aveți nevoie de o ștampilă de timp foarte precisă, dar rapid. CLOCK_MONOTONIC_RAW (de la Linux 2.6.28; disponibil numai pe Linux) Similar cu CLOCK_MONOTONIC. dar oferă acces direct la ceasurile hardware care nu sunt alimentate de NTP sau la o fixare treptată efectuată de adjtime (3). CLOCK_BOOTTIME (din moment ce Linux 2.6.39; disponibil doar pe Linux) CLOCK_MONOTONIC este identic. dar conține, de asemenea, orice moment în care sistemul a fost suspendat. Acest lucru permite aplicațiilor să primească un ceas monoton care ia în considerare suspendarea fără a recurge la complexitatea CLOCK_REALTIME. care poate fi eterogenă dacă timpul este schimbat utilizând settimeofday (2). CLOCK_PROCESS_CPUTIME_ID (din Linux 2.6.12) personalizate pentru fiecare ceas proces CPU (timp CPU măsurat petrecut de toate firele de proces). CLOCK_THREAD_CPUTIME_ID (începând cu Linux 2.6.12) Ceas care rulează pe CPU pentru fiecare fir.







RETURN VALUE

Daca va avea succes, funcția clock_gettime (), clock_settime () și clock_getres () return 0 sau -1 dacă a apărut o eroare (errno este setată corespunzător).

Aceste apeluri de sistem au apărut pentru prima oară în Linux 2.6.

DISPONIBILITATE

Pe sistemele POSIX, în care aceste funcții sunt disponibile, simbolul _POSIX_TIMERS. definite în . are o valoare mai mare decât 0. Caracterele _POSIX_MONOTONIC_CLOCK. _POSIX_CPUTIME. _POSIX_THREAD_CPUTIME arată că CLOCK_MONOTONIC este disponibil. CLOCK_PROCESS_CPUTIME_ID. CLOCK_THREAD_CPUTIME_ID. (vezi și sysconf (3).)

Istoric istoric privind sistemele SMP

Înainte de Linux a fost adăugat suport pentru CLOCK_PROCESS_CPUTIME_ID și CLOCK_THREAD_CPUTIME_ID. implementarea acestor ceasuri în glibc pe multe platforme a folosit registrele temporizatorului CPU (TSC pe i386, AR.ITC pe Itanium). Aceste registre pot fi diferite de procesoarele diferite și, ca urmare, aceste ceasuri pot întoarce rezultate false. dacă procesul se duce la alt procesor.

Dacă procesoarele din sistemele multiprocesor utilizează surse de timp diferite, atunci nu există nicio modalitate de a menține o reconciliere între registrele temporizatorului, deoarece fiecare CPU va funcționa cu o frecvență ușor diferită. În acest caz, clock_getcpuclockid (0) returnează ENOENT. pentru a indica această stare. Două ore în acest caz vor fi utile numai dacă vă puteți asigura că procesul a rămas pe un anumit procesor.

Procesoarele din sistemele multiprocesor nu încep să funcționeze în același timp și, prin urmare, registrele temporizatorului lucrează de obicei cu offset. Unele arhitecturi conțin cod care încearcă să reducă acest decalaj atunci când boot-ul sistemului. Cu toate acestea, codul nu poate garanta ajustarea exactă a offseturilor. Glibc nu are instrumentele necesare pentru a lucra cu aceste compensări (spre deosebire de kernel-ul Linux). De obicei, aceste deplasări sunt mici și, prin urmare, în majoritatea cazurilor, influența lor este nesemnificativă.

Începând cu glibc 2.4, apeluri de sistem funcția de ambalare descrise în această pagină, nu au astfel de probleme, așa cum este utilizat CLOCK_PROCESS_CPUTIME_ID CLOCK_THREAD_CPUTIME_ID nucleară și punerea în aplicare (în sistemele pe care le oferă, de exemplu, Linux 2.6.12 sau mai târziu).







Articole similare

Trimiteți-le prietenilor: