Provided by: manpages-pl-dev_4.21.0-2_all bug

NAZWA

       getitimer, setitimer - pobranie i ustawienie 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 timerów, które
       najpierw wygasają w pewnym punkcie w przyszłości, a potem (opcjonalnie) w regularnych odstępach czasu. Po
       wygaśnięciu timera wysyłany jest  sygnał  do  procesu  wywołującego,  a  następnie  timer  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 timerze 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 {
               long tv_sec;                /* sekundy */
               long 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  timerowi  do  następnego
       wygaśnięcia.  Wartość  ta  się  zmienia  podczas  odliczania  przez  czasomierz  i  zostanie ustawiona na
       it_interval, gdy timer wygaśnie. Obie wartości it_value równe zero oznaczają, że podany  timer  nie  jest
       obecnie aktywny.

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

   setitimer()
       Funkcja setitimer(2) włącza lub wyłącza timer podany w argumencie  which,  ustawiając  timer  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 timera (to jest ta sama informacja, którą zwraca getitimer()).

       Jeśli którekolwiek pole w new_value.it_value jest niezerowe, to timer 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 timer
       jest wyłączony.

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

WARTOŚĆ ZWRACANA

       Po pomyślnym zakończeniu zwracane jest zero. Po błędzie zwracane jest -1 i ustawiane jest 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.

STANDARDY

       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  timerów interwałowych rodzica. Jednakże timery 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).

       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  Linuska:  jest  nieprzenośna  i
       niepotrzebna.

BŁĘDY

       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.

       Before  Linux  2.6.16,  timer values are represented in jiffies.  If a request is made set a timer with a
       value whose jiffies representation exceeds MAX_SEC_IN_JIFFIES (defined in include/linux/jiffies.h),  then
       the  timer  is  silently  truncated to this ceiling value.  On Linux/i386 (where, since Linux 2.6.13, the
       default jiffy is 0.004 seconds), this means that the ceiling value for a  timer  is  approximately  99.42
       days.   Since  Linux  2.6.16,  the  kernel  uses  a different internal representation for times, and this
       ceiling is removed.

       On certain systems (including i386), Linux kernels before Linux 2.6.12 have  a  bug  which  will  produce
       premature  timer  expirations  of  up  to one jiffy under some circumstances.  This bug is fixed in Linux
       2.6.12.

       POSIX.1-2001 says that setitimer()  should fail if a tv_usec value is specified that is  outside  of  the
       range  [0, 999999].  However, up to and including Linux 2.6.21, Linux does not give an error, but instead
       silently adjusts the corresponding  seconds  value  for  the  timer.   From  Linux  2.6.22  onward,  this
       nonconformance has been repaired: an improper tv_usec value results in an EINVAL error.

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> i Robert Luberda <robert@debian.org>

       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.03                            12 lutego 2023 r.                                   getitimer(2)