setitimer

GETITIMER(2)            PodrÄcznik programisty Linuksa            GETITIMER(2)



NAZWA
       getitimer, setitimer - pobranie i ustawienie wartoÅci czasomierza

SKÅADNIA
       #include <sys/time.h>

       int getitimer(int which, struct itimerval *curr_value);
       int setitimer(int which, const struct itimerval *new_value,
                     struct itimerval *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).

   getitimer()
       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 odpowiednio ustawiane errno.

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.

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

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.

       W jÄdrach Linuksa wczeÅniejszych niż 2.6.16 wartoÅci timerów sÄ
       przedstawiane w jednostkach jiffies. JeÅli żÄdane jest ustawienie
       timera na wartoÅÄ, której reprezentacja w jiffies przekracza
       MAX_SEC_IN_JIFFIES (zdefiniowany w  include/linux/jiffies.h), to timer
       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 timera 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 Linuksa wczeÅniejsze niż 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 timera, nawet co jedno jiffy. BÅÄd zostaÅ poprawiony w
       jÄdrze 2.6.12.

       POSIX.1-2001 mówi, że setitimer() powinno zwróciÄ bÅÄd, jeÅli
       wartoÅÄ tv_usec jest spoza zakresu od 0 do 999999. Jednakże w jÄdrach
       Linuksa aż do wersji 2.6.21 wÅÄcznie tak siÄ nie dziaÅo. Zamiast tego
       Linux odpowiednio uaktualniaÅ liczbÄ sekund (tv_sec) czasomierza. W
       wersji jÄdra 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)

O STRONIE
       Angielska wersja tej strony pochodzi z wydania 4.07 projektu Linux
       man-pages. Opis projektu, informacje dotyczÄce zgÅaszania bÅÄdów oraz
       najnowszÄ wersjÄ oryginaÅu można znaleÅºÄ pod adresem
       https://www.kernel.org/doc/man-pages/.

TÅUMACZENIE
       Autorami polskiego tÅumaczenia niniejszej strony podrÄcznika man sÄ:
       Przemek Borys (PTM) <pborys@dione.ids.pl>, Andrzej M. Krzysztofowicz
       (PTM) <ankry@green.mf.pg.gda.pl> i Robert Luberda <robert@debian.org>.

       Polskie tÅumaczenie jest czÄÅciÄ projektu manpages-pl; uwagi, pomoc,
       zgÅaszanie bÅÄdów na stronie http://sourceforge.net/projects/manpages-
       pl/. Jest zgodne z wersjÄ  4.07 oryginaÅu.



Linux 0.99.11                     2016-07-17                      GETITIMER(2)