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   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.

Linux man-pages 6.8                              2 maja 2024 r.                                     getitimer(2)