Provided by: manpages-pl-dev_0.7-2_all 

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)