gettimeofday(2)

NUME
gettimeofday, settimeofday - obține / reglează ora

BIBLIOTECA
Biblioteca C standard (libc, -lc)

SINOPSIS
#include <sys/time.h>

[[depreciat]]
int gettimeofday(struct timeval *restrict tv,
                 struct timezone *_Nullable restrict tz);
[[depreciat]]
int settimeofday(const struct timeval *tv,
                 const struct timezone *_Nullable tz);

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

settimeofday():
    Începând cu glibc 2.19:
        _DEFAULT_SOURCE
    glibc 2.19 și versiunile anterioare:
        _BSD_SOURCE

DESCRIERE
Funcțiile gettimeofday() și settimeofday() pot obține și regla ora, precum și un fus orar.

Argumentul tv este o structură struct timeval (după cum se specifică în <sys/time.h>):

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

și oferă numărul de secunde și microsecunde de la Epocă (a se vedea time(2)).

Argumentul tz este o structură struct timezone:

    struct timezone {
        int tz_minuteswest;     /* minute la vest de Greenwich  */
        int tz_dsttime;         /* tipul de corecție a orei de vară */
    };

Dacă tv sau tz este NULL, structura corespunzătoare nu este definită sau returnată; (cu toate acestea, vor apărea avertismente de compilare dacă tv este NULL).

Utilizarea structurii timezone este învechită; argumentul tz ar trebui în mod normal să fie specificat ca NULL. A se vedea secțiunea VERSIUNI.

În Linux, există o semantică ciudată de „ceas de deformare” asociată cu apelul de sistem settimeofday() dacă la primul apel (după pornire) care are un argument tz non-NULL, argumentul tv este NULL și câmpul tz_minuteswest este diferit de zero; (câmpul tz_dsttime ar trebui să fie zero pentru acest caz). Într-un astfel de caz, se presupune că ceasul CMOS este la ora locală și că trebuie să fie incrementat cu această valoare pentru a obține ora sistemului UTC. Fără îndoială, este o idee proastă să folosiți această caracteristică.

VALOAREA RETURNATĂ
gettimeofday() și settimeofday() returnează 0 pentru succes. În caz de eroare, se returnează -1, iar errno este configurată pentru a indica eroarea.

ERORI-IEȘIRE

EFAULT
    Unul dintre argumente tv sau tz a indicat în afara spațiului de adrese accesibil.

EINVAL
    (settimeofday()): timezone nu este valid.

EINVAL
    (settimeofday()): tv.tv_sec este negativ sau tv.tv_usec este în afara intervalului [0, 999,999].

EINVAL (începând cu Linux 4.3)
    (settimeofday()): S-a încercat reglarea orei la o valoare mai mică decât valoarea curentă a ceasului CLOCK_MONOTONIC (consultați clock_gettime(2)).

EPERM
    Procesul apelant nu are privilegii suficiente pentru a apela settimeofday(); sub Linux este necesară capacitatea CAP_SYS_TIME.

VERSIUNI

  Diferențe între biblioteca C și nucleu
Pe unele arhitecturi, o implementare a gettimeofday() este furnizată în vdso(7).

Nucleul acceptă NULL atât pentru tv, cât și pentru tz. Argumentul fusului orar este ignorat de glibc și musl și nu este transmis către/de la nucleu. Android bionic transmite argumentul fusului orar către/de la nucleu, dar Android nu actualizează fusul orar al nucleului pe baza fusului orar al dispozitivului din Configurări, astfel încât fusul orar al nucleului este de obicei UTC.

STANDARDE
Niciunul.

ISTORIC
4.3BSD, SVr4. SUSv1 și POSIX.1-2001 XSI descriu gettimeofday() dar nu și settimeofday(). POSIX.1-2008 XSI marchează gettimeofday() ca fiind învechită, recomandând în schimb utilizarea clock_gettime(2) . În mod similar, clock_settime(2) ar trebui utilizată în locul settimeofday(). POSIX.1-2024 a eliminat gettimeofday().

În mod tradițional, câmpurile din struct timeval erau de tip long.

  Câmpul tz_dsttime
Pe un nucleu non-Linux, cu glibc, câmpul tz_dsttime din struct timezone va fi stabilit la o valoare diferită de zero de către gettimeofday() dacă fusului orar curent i s-a aplicat sau i se va aplica vreodată o regulă de schimbare a orei de vară. În acest sens, aceasta reflectă exact semnificația lui daylight(3) pentru fusul curent. Pe Linux, cu glibc, stabilirea câmpului tz_dsttime din struct timezone nu a fost niciodată utilizată de settimeofday() sau gettimeofday(). Prin urmare, cele ce urmează sunt pur de interes istoric.

Pe sistemele vechi, câmpul tz_dsttime conține o constantă simbolică (valorile sunt date mai jos) care indică în ce parte a anului este în vigoare ora de vară. Notă: această valoare este constantă pe tot parcursul anului: ea nu indică faptul că DST (ora de vară) este în vigoare, ci doar selectează un algoritm. Algoritmii pentru ora de vară definiți sunt următorii:

    DST_NONE     /* nu la ora de vară */
    DST_USA      /* ora de vară în stil SUA */
    DST_AUST     /* ora de vară în stil australian */
    DST_WET      /* ora de vară în stil Europa de vest */
    DST_MET      /* ora de vară în stil Europa centrală */
    DST_EET      /* ora de vară în stil Europa de est */
    DST_CAN      /* Canada */
    DST_GB       /* Marea Britaie și Irlanda */
    DST_RUM      /* România */
    DST_TUR      /* Turcia */
    DST_AUSTALT  /* Stil australian cu schimbare în 1986 */

Desigur, s-a dovedit că perioada în care este în vigoare ora de vară nu poate fi dată de un algoritm simplu, unul pentru fiecare țară; într-adevăr, această perioadă este determinată de decizii politice imprevizibile. Prin urmare, această metodă de reprezentare a fusurilor orare a fost abandonată.

NOTE
Ora returnată de gettimeofday() este afectată de salturi discontinue în ora sistemului (de exemplu, dacă administratorul sistemului modifică manual ora sistemului). Dacă aveți nevoie de un ceas care crește monoton, consultați clock_gettime(2).

Macrocomenzile pentru operarea structurilor timeval sunt descrise în timeradd(3).

CONSULTAȚI ȘI
date(1), adjtimex(2), clock_gettime(2), time(2), ctime(3), ftime(3), timeradd(3), capabilities(7), time(7), vdso(7), hwclock(8)

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.