getitimer(2)

NUME
getitimer, setitimer - obține sau stabilește valoarea unui temporizator de interval

BIBLIOTECA
Biblioteca C standard (libc, -lc)

SINOPSIS
#include <sys/time.h>

int getitimer(int which, struct itimerval *curr_value);
int setitimer(int which, const struct itimerval *restrict new_value,
              struct itimerval *_Nullable restrict old_value);

DESCRIERE
Aceste apeluri de sistem oferă acces la temporizatoare de interval, adică la temporizatoare care expiră inițial la un moment dat în viitor și (opțional) la intervale regulate după aceea. Atunci când un temporizator expiră, se generează un semnal pentru procesul apelant, iar temporizatorul este repus la intervalul specificat (dacă intervalul este diferit de zero).

Sunt furnizate trei tipuri de temporizatoare -- specificate prin intermediul argumentului which -- fiecare dintre acestea numără în funcție de un ceas diferit și generează un semnal diferit la expirarea temporizatorului:

ITIMER_REAL
    Acest temporizator numără în timp real (adică, ceas etalon „wall clock”). La fiecare expirare, se generează un semnal SIGALRM.

ITIMER_VIRTUAL
    Acest temporizator numără timpul de procesare consumat de proces în modul utilizator; (măsurarea include timpul CPU consumat de toate firele din proces). La fiecare expirare, se generează un semnal SIGVTALRM.

ITIMER_PROF
    Acest temporizator numără timpul total (adică atât cel consumat de utilizator, cât și cel consumat de sistem) de procesare consumat de proces; (măsurarea include timpul CPU consumat de toate firele din proces). La fiecare expirare, se generează un semnal SIGPROF.

    Împreună cu ITIMER_VIRTUAL, acest temporizator poate fi utilizat pentru a trasa profilul timpului de procesare al utilizatorului și al sistemului consumat de proces.

Un proces are doar unul din fiecare dintre cele trei tipuri de temporizatoare.

Valorile temporizatoarelor sunt definite de următoarele structuri:

    struct itimerval {
        struct timeval it_interval; /* Intervalul pentru temporizatorul periodic */
        struct timeval it_value;    /* Timpul până la următoarea expirare */
    };

    struct timeval {
        time_t      tv_sec;         /* secunde */
        suseconds_t tv_usec;        /* microsecunde */
    };

  getitimer()
Funcția getitimer() plasează valoarea curentă a temporizatorului specificat de which în memoria tampon indicată de curr_value.

Substructura it_value este completată cu cantitatea de timp rămasă până la următoarea expirare a temporizatorului specificat. Această valoare se modifică pe măsură ce cronometrul scade și va fi readusă la it_interval atunci când expiră temporizatorul. Dacă ambele câmpuri din it_value sunt zero, atunci acest temporizator este în prezent dezarmat (inactiv).

Substructura it_interval este completată cu intervalul de timp. În cazul în care ambele câmpuri din it_interval sunt zero, atunci este vorba de un temporizator „single-shot” (adică expiră o singură dată).

  setitimer()
Funcția setitimer() armează sau dezarmează temporizatorul specificat de which, prin fixarea temporizatorului la valoarea specificată de new_value. În cazul în care old_value nu este NULL, memoria tampon la care indică este utilizată pentru a returna valoarea anterioară a temporizatorului (adică aceleași informații care sunt returnate de getitimer()).

Dacă oricare dintre câmpurile din new_value.it_value este diferit de zero, atunci temporizatorul este armat pentru a expira inițial la ora specificată. Dacă ambele câmpuri din new_value.it_value sunt zero, atunci temporizatorul este dezarmat.

Câmpul new_value.it_interval specifică noul interval pentru temporizator; dacă ambele subcâmpuri ale acestuia sunt zero, temporizatorul are o singură declanșare „single-shot”.

VALOAREA RETURNATĂ
În caz de succes, se returnează zero. În caz de eroare, se returnează -1, iar errno este configurată pentru a indica eroarea.

ERORI-IEȘIRE

EFAULT
    new_value, old_value sau curr_value nu este un indicator valid.

EINVAL
    which nu este unul dintre ITIMER_REAL, ITIMER_VIRTUAL sau ITIMER_PROF; sau (de la Linux 2.6.22) unul dintre câmpurile tv_usec din structura indicată de new_value conține o valoare în afara intervalului [0, 999999].

VERSIUNI
Standardele nu spun nimic cu privire la semnificația apelului:

    setitimer(which, NULL, &old_value);

Multe sisteme (Solaris, BSD și poate și altele) tratează acest lucru ca fiind echivalent cu:

    getitimer(which, &old_value);

În Linux, acest lucru este tratat ca fiind echivalent cu un apel în care câmpurile new_value sunt zero; adică, temporizatorul este dezactivat. Nu folosiți această caracteristică greșită din Linux: este neportabilă și nefolositoare.

STANDARDE
Niciunul.

ISTORIC
POSIX.1-2001, SVr4, 4.4BSD (acest apel a apărut pentru prima dată în 4.2BSD). POSIX.1-2008 marchează getitimer() și setitimer() ca fiind învechite, recomandând în schimb utilizarea API POSIX timers (timer_gettime(2), timer_settime(2), etc.). POSIX.1-2024 le-a eliminat.

NOTE
Temporizatoarele nu vor expira niciodată înainte de ora solicitată, dar pot expira la o anumită perioadă (scurtă) de timp după aceea, care depinde de rezoluția temporizatorului de sistem și de sarcina sistemului; a se vedea time(7); (dar vedeți însă secțiunea ERORI de mai jos). Dacă temporizatorul expiră în timp ce procesul este activ (întotdeauna adevărat pentru ITIMER_VIRTUAL), semnalul va fi livrat imediat ce este generat.

Un copil creat prin fork(2) nu moștenește temporizatoarele de interval ale părintelui său. Temporizatoarele de interval sunt păstrate în cazul unui execve(2).

POSIX.1 lasă nespecificată interacțiunea dintre setitimer() și cele trei interfețe alarm(2), sleep(3) și usleep(3).

ERORI
Generarea și transmiterea unui semnal sunt distincte și un singur exemplu pentru fiecare dintre semnalele enumerate mai sus poate fi în așteptare pentru un proces. În cazul unei încărcări foarte mari, un temporizator ITIMER_REAL poate expira înainte ca semnalul de la o expirare anterioară să fi fost transmis. În acest caz, al doilea semnal se pierde.

Înainte de Linux 2.6.16, valorile temporizatoarelor sunt reprezentate în clipe „jiffies”. În cazul în care se face o cerere care definește un temporizator cu o valoare a cărei reprezentare jiffies depășește MAX_SEC_IN_JIFFIES (definit în include/linux/jiffies.h), atunci temporizatorul este trunchiat în mod silențios la această valoare plafon. Pe Linux/i386 (unde, începând cu Linux 2.6.13, valoarea implicită a unei clipe „jiffy” este de 0,004 secunde), acest lucru înseamnă că valoarea plafon pentru un temporizator este de aproximativ 99,42 zile. Începând cu Linux 2.6.16, nucleul utilizează o reprezentare internă diferită pentru timpi, iar acest plafon este eliminat.

Pe anumite sisteme (inclusiv i386), nucleele Linux anterioare la Linux 2.6.12 au o eroare care, în anumite circumstanțe, va produce expirarea prematură a temporizatorului de până la o clipă „jiffy”. Această eroare este corectată în Linux 2.6.12.

POSIX.1-2001 spune că setitimer() trebuie să eșueze dacă este specificată o valoare tv_usec care se află în afara intervalului [0, 999999]. Cu toate acestea, până la Linux 2.6.21 inclusiv, Linux nu dă o eroare, dar în schimb ajustează în tăcere valoarea corespunzătoare în secunde pentru temporizator. Începând cu Linux 2.6.22, această neconformitate a fost reparată: o valoare tv_usec necorespunzătoare are ca rezultat o eroare EINVAL.

CONSULTAȚI ȘI
gettimeofday(2), sigaction(2), signal(2), timer_create(2), timerfd_create(2), 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.