getitimer(2)

NAZWA
getitimer, setitimer - pobranie i ustawienie 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 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; /* Interval for periodic timer */
        struct timeval it_value;    /* Time until next expiration */
    };

    struct timeval {
        time_t      tv_sec;         /* seconds */
        suseconds_t tv_usec;        /* microseconds */
    };

  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).

  setitimer()
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 ustawiane jest 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 Linuska: 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 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).

BŁĘDY
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.

Before Linux 2.6.16, timer values are represented in jiffies. If a request is made set a timer with a value whose jiffies representation exceeds MAX_SEC_IN_JIFFIES (defined in include/linux/jiffies.h), then the timer is silently truncated to this ceiling value. On Linux/i386 (where, since Linux 2.6.13, the default jiffy is 0.004 seconds), this means that the ceiling value for a timer is approximately 99.42 days. Since Linux 2.6.16, the kernel uses a different internal representation for times, and this ceiling is removed.

On certain systems (including i386), Linux kernels before Linux 2.6.12 have a bug which will produce premature timer expirations of up to one jiffy under some circumstances. This bug is fixed in Linux 2.6.12.

POSIX.1-2001 says that setitimer() should fail if a tv_usec value is specified that is outside of the range [0, 999999]. However, up to and including Linux 2.6.21, Linux does not give an error, but instead silently adjusts the corresponding seconds value for the timer. From Linux 2.6.22 onward, this nonconformance has been repaired: an improper tv_usec value results in an EINVAL error.

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> i Robert Luberda <robert@debian.org>

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 (https://www.gnu.org/licenses/gpl-3.0.html) 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.