oracular (2) setitimer.2.gz

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