Man page - setitimer(2)

Packages contains this manual

Available languages:

en fr pl nl ja ru ro de

Manual

getitimer

NAZWA
BIBLIOTEKA
SKŁADNIA
OPIS
getitimer()
setitimer()
WARTOŚĆ ZWRACANA
BŁĘDY
WERSJE
STANDARDY
HISTORIA
UWAGI
USTERKI
ZOBACZ TAKŻE
TŁUMACZENIE

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

Tłumaczenie niniejszej strony podręcznika: 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 .