getitimer(2) System Calls Manual getitimer(2) NAZWA getitimer, setitimer - pobiera i ustawia wartosci czasomierza BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #include 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 wywolania systemowe umozliwiaja dostep do czasomierzy (timerow) interwalowych, to jest czasomierzy, ktore najpierw wygasaja w pewnym punkcie w przyszlosci, a potem (opcjonalnie) w regularnych odstepach czasu. Po wygasnieciu czasomierza wysylany jest sygnal do procesu wywolujacego, a nastepnie czasomierz jest ponownie inicjowany podana wartoscia interwalu (jesli jest niezerowa). Dostepne sa trzy typy czasomierzy, podawane w argumencie which; kazdy z nich mierzy czas wedlug innego zegara i generuje inny sygnal, gdy uplynie czas waznosci: ITIMER_REAL Odlicza czas rzeczywisty. Po wygasnieciu generuje sygnal SIGALRM. ITIMER_VIRTUAL Odlicza czas CPU wykonywania sie procesu w przestrzeni uzytkownika. (Obliczenia obejmuja czas CPU zuzyty przez wszystkie watki procesu). Po kazdorazowym wygasnieciu generowany jest sygnal SIGVTALRM. ITIMER_PROF Odlicza calkowity (tj. zarowno w przestrzeni uzytkownika, jak i jadra systemu) czas CPU wykonywania sie procesu. (Obliczenia obejmuja czas CPU zuzyty przez wszystkie watki procesu). Po kazdorazowym wygasnieciu generowany jest sygnal SIGPROF. W powiazaniu z ITIMER_VIRTUAL ten czasomierz zwykle jest uzywany do profilowania czasu uzywanego przez aplikacje zarowno w przestrzeni uzytkownika, jak i jadra. Proces ma tylko po jednym czasomierzu kazdego z tych trzech typow. Wartosci czasomierza sa zdefiniowane za pomoca nastepujacych struktur: struct itimerval { struct timeval it_interval; /* Interwal czasomierza periodycznego */ struct timeval it_value; /* Czas do nastepnego wygasniecia */ }; struct timeval { time_t tv_sec; /* sekundy */ suseconds_t tv_usec; /* mikrosekundy */ }; getitimer() Funkcja getitimer() wypelnia bufor wskazywany przez curr_value biezacym wskazaniem czasomierza podanego w parametrze which. Do struktury it_value jest wpisywana ilosc czasu, ktory pozostal podanemu czasomierzowi do nastepnego wygasniecia. Wartosc ta sie zmienia podczas odliczania przez czasomierz i zostanie ustawiona na it_interval, gdy czasomierz wygasnie. Obie wartosci it_value rowne zero oznaczaja, ze podany czasomierz nie jest obecnie aktywny. Struktura w it_interval jest ustawiana na odstep pomiedzy kolejnymi wygasnieciami czasomierza. Oba pola w it_interval rowne zero oznaczaja czasomierz jednorazowy (czyli, ze wygasa tylko raz). setitimer() Funkcja setitimer(2) wlacza lub wylacza czasomierz podany w argumencie which, ustawiajac czasomierz na wartosc podana w new_value. Jesli old_value jest rozne od NULL, to bufor, na ktory wskazuje, jest uzywany do zwrocenia poprzedniej wartosci czasomierza (to jest ta sama informacja, ktora zwraca getitimer()). Jesli ktorekolwiek pole w new_value.it_value jest niezerowe, to czasomierz jest aktywowany i ustawiony tak, zeby poczatkowo wygasl w podanym czasie. Jesli oba pola w new_value.it_value maja wartosc zero, to czasomierz jest wylaczony. Pole new_value.it_interval okresla nowy interwal dla czasomierza, jesli oba pola w nim zawarte maja wartosc zero, to jest to czasomierz jednorazowy. WARTOSC ZWRACANA Po pomyslnym zakonczeniu zwracane jest zero. Po bledzie zwracane jest -1 i ustawiane jest errno wskazujac blad. BLEDY EFAULT new_value, old_value lub curr_value nie jest poprawnym wskaznikiem. EINVAL which nie jest jednym z ITIMER_REAL, ITIMER_VIRTUAL lub ITIMER_PROF albo (od Linuksa 2.6.22) jedno z pol tv_usec w strukturze wskazywanej przez new_value zawiera wartosc spoza zakresu od 0 do 999999. WERSJE Standardy nie okreslaja znaczenia ponizszego wywolania: setitimer(which, NULL, &old_value); Wiele systemow (Solaris, systemy BSD i byc moze rowniez inne) traktuje to jako rownowazne z: getitimer(which, &old_value); Pod Linuksem jest to odpowiednikiem wywolania, w ktorym pola new_value sa ustawione na zero, to jest czasomierz jest wylaczany. Prosimiy o nieuzywanie tej wlasciwosci Linuksa: jest nieprzenosna i niepotrzebna. STANDARDY POSIX.1-2008. HISTORIA POSIX.1-2001, SVr4, 4.4BSD (to wywolanie najpierw pojawilo sie w 4.2BSD). POSIX.1-2008 uznaje getitimer() i setitimer() za przestarzale, zalecajac zamiast nich uzywanie API POSIX-owych czasomierzy (timer_gettime(2), timer_settime(2) i tak dalej). UWAGI Waznosc czasomierzy nigdy nie uplywa przed zadanym czasem, natomiast moze ona uplynac jakis (krotki) czas pozniej, co zalezy od rozdzielczosci zegara systemowego i obciazenia systemu, patrz time(7) (patrz takze rozdzial USTERKI ponizej). Jesli czas waznosci uplywa, gdy proces jest aktywny (jest to zawsze prawda dla ITIMER_VIRTUAL), to sygnal zostanie dostarczony natychmiast po wygenerowaniu. Dziecko utworzone przez fork(2) nie dziedziczy czasomierzy interwalowych rodzica. Jednakze czasomierze te sa zachowywane przez execve(2). POSIX.1 nie okresla interakcji pomiedzy setitimer() i trzema interfejsami alarm(2), sleep(3) oraz usleep(3). USTERKI Pod Linuksem generowanie i dostarczanie sygnalu sa oddzielnymi zdarzeniami i dla kazdego sygnalu moze byc tylko jedno zalegle zdarzenie. Zatem mozliwe jest, ze podczas patologicznie duzego obciazenia czas waznosci ITIMER_REAL moze uplynac wczesniej, niz sygnal poprzedniego przeterminowania zostanie dostarczony. Drugi sygnal w takiej sytuacji zostanie utracony. Przed Linuksem 2.6.16 wartosci czasomierzy sa przedstawiane w jednostkach jiffies. Jesli zadane jest ustawienie czasomierza na wartosc, ktorej reprezentacja w jiffies przekracza MAX_SEC_IN_JIFFIES (zdefiniowany w include/linux/jiffies.h), to czasomierz jest po cichu obcinany do tej wartosci progowej. W systemie Linux/i386 (gdzie od Linuksa 2.6.13 wartosc jednego jiffy jest rowna 0,004 sekundy), oznacza to, ze wartosc progowa czasomierza w przyblizeniu wynosi 99,42 dni. Od Linuksa 2.6.16 jadro uzywa innej wewnetrznej reprezentacji czasow i to ograniczenie jest usuniete. Jadra Linux wczesniejsze niz Linux 2.6.12 mialy na niektorych systemach (wlaczajac w to i386) blad powodujacy w pewnych sytuacjach ciagle wygaszanie czasomierza, nawet co jedno jiffy. Blad zostal poprawiony w Linuksie 2.6.12. POSIX.1-2001 mowi, ze setitimer() powinno zwrocic blad, jesli wartosc tv_usec jest spoza zakresu [0, 999999]. Jednakze w jadrach az do Linuksa 2.6.21 wlacznie tak sie nie dzialo. Zamiast tego Linux odpowiednio uaktualnial liczbe sekund (tv_sec) czasomierza. W wersji Linuksa 2.6.22 ta niezgodnosc ze standardem zostala naprawiona: niepoprawna wartosc tv_usec powoduje zwrocenie bledu EINVAL. ZOBACZ TAKZE gettimeofday(2), sigaction(2), signal(2), timer_create(2), timerfd_create(2), time(7) TLUMACZENIE Autorami polskiego tlumaczenia niniejszej strony podrecznika sa: Przemek Borys , Andrzej Krzysztofowicz , Robert Luberda i Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.06 31 pazdziernika 2023 r. getitimer(2)