table of contents
getitimer(2) | System Calls Manual | getitimer(2) |
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¶
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.
2 maja 2024 r. | Linux man-pages (niewydane) |