Provided by: manpages-pl-dev_4.23.1-1_all bug

NAZWA

       getitimer, setitimer - pobiera i ustawia wartości czasomierza

BIBLIOTEKA

       Standardowa biblioteka C (libc, -lc)

SKŁADNIA

       #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);

OPIS

       Te  wywołania systemowe umożliwiają dostęp do czasomierzy (timerów) interwałowych, to jest
       czasomierzy, które najpierw wygasają w pewnym punkcie w przyszłości, a potem (opcjonalnie)
       w  regularnych odstępach czasu. Po wygaśnięciu czasomierza wysyłany jest sygnał do procesu
       wywołującego, a następnie czasomierz jest ponownie inicjowany podaną  wartością  interwału
       (jeśli jest niezerowa).

       Dostępne  są  trzy typy czasomierzy, podawane w argumencie which; każdy z nich mierzy czas
       według innego zegara i generuje inny sygnał, gdy upłynie czas ważności:

       ITIMER_REAL
              Odlicza czas rzeczywisty. Po wygaśnięciu generuje sygnał SIGALRM.

       ITIMER_VIRTUAL
              Odlicza czas CPU wykonywania się procesu  w  przestrzeni  użytkownika.  (Obliczenia
              obejmują   czas   CPU  zużyty  przez  wszystkie  wątki  procesu).  Po  każdorazowym
              wygaśnięciu generowany jest sygnał SIGVTALRM.

       ITIMER_PROF
              Odlicza całkowity (tj. zarówno w przestrzeni użytkownika, jak i jądra systemu) czas
              CPU  wykonywania się  procesu. (Obliczenia obejmują czas CPU zużyty przez wszystkie
              wątki procesu). Po każdorazowym wygaśnięciu generowany jest sygnał SIGPROF.

              W powiązaniu z ITIMER_VIRTUAL ten czasomierz zwykle jest  używany  do  profilowania
              czasu używanego przez aplikację zarówno w przestrzeni użytkownika, jak i jądra.

       Proces ma tylko po jednym czasomierzu każdego z tych trzech typów.

       Wartości czasomierza są zdefiniowane za pomocą następujących struktur:

           struct itimerval {
               struct timeval it_interval; /* Interwał czasomierza periodycznego */
               struct timeval it_value;    /* Czas do następnego wygaśnięcia */
           };

           struct timeval {
               time_t      tv_sec;         /* sekundy */
               suseconds_t tv_usec;        /* mikrosekundy */
           };

   getitimer()
       Funkcja  getitimer()  wypełnia  bufor  wskazywany  przez  curr_value  bieżącym  wskazaniem
       czasomierza podanego w parametrze which.

       Do struktury it_value jest wpisywana ilość czasu, który pozostał podanemu czasomierzowi do
       następnego  wygaśnięcia.  Wartość  ta  się  zmienia  podczas odliczania przez czasomierz i
       zostanie ustawiona na it_interval, gdy czasomierz wygaśnie. Obie wartości  it_value  równe
       zero oznaczają, że podany czasomierz nie jest obecnie aktywny.

       Struktura  w  it_interval  jest  ustawiana  na  odstęp  pomiędzy  kolejnymi  wygaśnięciami
       czasomierza. Oba pola w it_interval równe zero oznaczają czasomierz jednorazowy (czyli, że
       wygasa tylko raz).

   setitimer()
       Funkcja  setitimer(2)  włącza lub wyłącza czasomierz podany w argumencie which, ustawiając
       czasomierz na wartość podaną w new_value. Jeśli old_value jest różne od NULL, to bufor, na
       który  wskazuje,  jest  używany  do zwrócenia poprzedniej wartości czasomierza (to jest ta
       sama informacja, którą zwraca getitimer()).

       Jeśli którekolwiek pole w new_value.it_value jest niezerowe, to czasomierz jest aktywowany
       i   ustawiony   tak,   żeby   początkowo  wygasł  w  podanym  czasie.  Jeśli  oba  pola  w
       new_value.it_value mają wartość zero, to czasomierz jest wyłączony.

       Pole new_value.it_interval określa nowy interwał dla czasomierza, jeśli  oba  pola  w  nim
       zawarte mają wartość zero, to jest to czasomierz jednorazowy.

WARTOŚĆ ZWRACANA

       Po  pomyślnym  zakończeniu  zwracane  jest  zero.  Po błędzie zwracane jest -1 i ustawiane
       errno, wskazując błąd.

BŁĘDY

       EFAULT new_value, old_value lub curr_value nie jest poprawnym wskaźnikiem.

       EINVAL which nie jest jednym  z  ITIMER_REAL,  ITIMER_VIRTUAL  lub  ITIMER_PROF  albo  (od
              Linuksa  2.6.22)  jedno  z  pól  tv_usec  w  strukturze wskazywanej przez new_value
              zawiera wartość spoza zakresu od 0 do 999999.

WERSJE

       Standardy nie określają znaczenia poniższego wywołania:

           setitimer(which, NULL, &old_value);

       Wiele systemów (Solaris, systemy BSD i być może również inne) traktuje to jako  równoważne
       z:

           getitimer(which, &old_value);

       Pod  Linuksem  jest  to  odpowiednikiem wywołania, w którym pola new_value są ustawione na
       zero, to jest czasomierz jest wyłączany. Prosimiy o nieużywanie tej  właściwości  Linuksa:
       jest nieprzenośna i niepotrzebna.

STANDARDY

       POSIX.1-2008.

HISTORIA

       POSIX.1-2001,  SVr4,  4.4BSD  (to  wywołanie najpierw pojawiło się w 4.2BSD). POSIX.1-2008
       uznaje getitimer() i setitimer() za przestarzałe,  zalecając  zamiast  nich  używanie  API
       POSIX-owych czasomierzy (timer_gettime(2), timer_settime(2) i tak dalej).

UWAGI

       Ważność  czasomierzy  nigdy  nie  upływa  przed zadanym czasem, natomiast może ona upłynąć
       jakiś (krótki) czas później, co zależy od rozdzielczości zegara systemowego  i  obciążenia
       systemu, patrz time(7) (patrz także rozdział USTERKI poniżej). Jeśli czas ważności upływa,
       gdy proces jest aktywny (jest to zawsze prawda dla  ITIMER_VIRTUAL),  to  sygnał  zostanie
       dostarczony natychmiast po wygenerowaniu.

       Dziecko utworzone przez fork(2) nie dziedziczy czasomierzy interwałowych rodzica. Jednakże
       czasomierze te są zachowywane przez execve(2).

       POSIX.1 nie określa  interakcji  pomiędzy  setitimer()  i  trzema  interfejsami  alarm(2),
       sleep(3) oraz usleep(3).

USTERKI

       Pod  Linuksem  generowanie i dostarczanie sygnału są oddzielnymi zdarzeniami i dla każdego
       sygnału  może  być  tylko  jedno  zaległe  zdarzenie.  Zatem  możliwe  jest,  że   podczas
       patologicznie  dużego  obciążenia  czas  ważności  ITIMER_REAL może upłynąć wcześniej, niż
       sygnał poprzedniego przeterminowania zostanie dostarczony. Drugi sygnał w takiej  sytuacji
       zostanie utracony.

       Przed  Linuksem  2.6.16 wartości czasomierzy są przedstawiane w jednostkach jiffies. Jeśli
       żądane jest ustawienie czasomierza na wartość, której reprezentacja w  jiffies  przekracza
       MAX_SEC_IN_JIFFIES  (zdefiniowany  w include/linux/jiffies.h), to czasomierz jest po cichu
       obcinany do tej wartości progowej. W systemie Linux/i386 (gdzie od Linuksa 2.6.13  wartość
       jednego  jiffy  jest  równa  0,004  sekundy), oznacza to, że wartość progowa czasomierza w
       przybliżeniu  wynosi  99,42  dni.  Od  Linuksa  2.6.16  jądro  używa   innej   wewnętrznej
       reprezentacji czasów i to ograniczenie jest usunięte.

       Jądra  Linux  wcześniejsze  niż Linux 2.6.12 miały na niektórych systemach (włączając w to
       i386) błąd powodujący w pewnych sytuacjach ciągłe wygaszanie czasomierza, nawet  co  jedno
       jiffy. Błąd został poprawiony w Linuksie 2.6.12.

       POSIX.1-2001  mówi,  że setitimer() powinno zwrócić błąd, jeśli wartość tv_usec jest spoza
       zakresu [0, 999999]. Jednakże w jądrach aż do Linuksa 2.6.21 włącznie tak się nie  działo.
       Zamiast  tego  Linux  odpowiednio uaktualniał liczbę sekund (tv_sec) czasomierza. W wersji
       Linuksa 2.6.22 ta  niezgodność  ze  standardem  została  naprawiona:  niepoprawna  wartość
       tv_usec powoduje zwrócenie błędu EINVAL.

ZOBACZ TAKŻE

       gettimeofday(2), sigaction(2), signal(2), timer_create(2), timerfd_create(2), time(7)

TŁUMACZENIE

       Autorami   polskiego   tłumaczenia   niniejszej   strony  podręcznika  są:  Przemek  Borys
       <pborys@dione.ids.pl>, Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl>,  Robert  Luberda
       <robert@debian.org> i Michał Kułach <michal.kulach@gmail.com>

       Niniejsze  tłumaczenie  jest  wolną  dokumentacją. Bliższe informacje o warunkach licencji
       można   uzyskać   zapoznając   się   z   GNU   General   Public   License   w   wersji   3
       ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩   lub   nowszej.   Nie  przyjmuje  się  ŻADNEJ
       ODPOWIEDZIALNOŚCI.

       Błędy w tłumaczeniu  strony  podręcznika  prosimy  zgłaszać  na  adres  listy  dyskusyjnej
       ⟨manpages-pl-list@lists.sourceforge.net⟩.