getrusage(2)

NAZWA
getrusage - pobiera użycie zasobów

BIBLIOTEKA
Standardowa biblioteka C (libc, -lc)

SKŁADNIA
#include <sys/resource.h>

int getrusage(int who, struct rusage *usage);

OPIS
getrusage() zwraca użycie zasobów zmierzone dla who, którym może być jeden z:

RUSAGE_SELF
    Zwraca statystyki użycia zasobów procesu wywołującego, czyli sumę zasobów użytych przez wszystkie wątki procesu.

RUSAGE_CHILDREN
    Zwraca statystyki użycia zasobów przez wszystkie dzieci procesu wywołującego, które się zakończyły i na które się oczekuje. Statystyki te obejmą zasoby użyte przez wnuki i kolejne pokolenia, jeśli wszystkie one oczekują na swoich zakończonych potomków.

RUSAGE_THREAD (od Linuksa 2.6.26)
    Zwraca statystyki użycia zasobów przez wątek wywołujący. Aby uzyskać definicję tej stałej z <sys/resource.h> konieczne jest zdefiniowanie makra sprawdzania cech _GNU_SOURCE (przed dołączeniem jakichkolwiek plików nagłówkowych).

Użycie zasobów jest zwracane w strukturze, na którą wskazuje usage, w postaci:

    struct rusage {
        struct timeval ru_utime; /* użyty czas procesora użytkownika */
        struct timeval ru_stime; /* użyty czas procesora systemu */
        long   ru_maxrss;        /* maksymalny rozmiar zestawu rezydentnego */
        long   ru_ixrss;         /* całkowity rozmiar pamięci dzielonej */
        long   ru_idrss;         /* całkowity rozmiar niedzielonych danych */
        long   ru_isrss;         /* całkowity rozmiar niedzielonego stosu */
        long   ru_minflt;        /* odzyskane strony (pomniejsze chybienia) */
        long   ru_majflt;        /* chybienia stron (główne chybienia) */
        long   ru_nswap;         /* wymienione strony */
        long   ru_inblock;       /* blokowe operacje wejścia */
        long   ru_oublock;       /* blokowe operacje wyjścia */
        long   ru_msgsnd;        /* wysłane komunikaty IPC */
        long   ru_msgrcv;        /* otrzymane komunikaty IPC */
        long   ru_nsignals;      /* otrzymane sygnały */
        long   ru_nvcsw;         /* dobrowolne przełączenia kontekstu */
        long   ru_nivcsw;        /* przymusowe przełączenia kontekstu */
    };

Nie wszystkie pola są ukończone; pola nieutrzymywane są ustawiane na zero przez jądro (pola nieutrzymywane są zapewniane ze względu na kompatybilność z innymi systemami i ponieważ w przyszłości mogą być obsługiwane w Linuksie). Pola są interpretowane w następujący sposób:

ru_utime
    Całkowity czas spędzony na wykonywaniu w trybie użytkownika, wyrażony jako struktura timeval (sekundy i mikrosekundy).

ru_stime
    Całkowity czas spędzony na wykonywaniu w trybie jądra, wyrażony jako struktura timeval (sekundy i mikrosekundy).

ru_maxrss (od Linuksa 2.6.32)
    Szczytowy osiągnięty rozmiar zestawu rezydentnego („resident set size” — RSS; w KiB). W przypadku RUSAGE_CHILDREN, dotyczy to RSS największego potomka, a nie RSS całego drzewa procesów.

ru_ixrss (nieutrzymywane)
    W Linuksie, pole to jest aktualnie nieużywane.

ru_idrss (nieutrzymywane)
    W Linuksie, pole to jest aktualnie nieużywane.

ru_isrss (nieutrzymywane)
    W Linuksie, pole to jest aktualnie nieużywane.

ru_minflt
    Liczba chybień stron (page fault), obsłużonych bez aktywności wejścia/wyjścia; tu, aktywność ta jest unikana dzięki „odzyskaniu” ramki strony z listy stron oczekujących na realokację.

ru_majflt
    Liczba obsłużonych chybień stron, które wymagały aktywności wejścia/wyjścia.

ru_nswap (nieutrzymywane)
    W Linuksie, pole to jest aktualnie nieużywane.

ru_inblock (od Linuksa 2.6.22)
    Liczba przypadków, w których system plików musiał obsłużyć wejście.

ru_oublock (od Linuksa 2.6.22)
    Liczba przypadków, w których system plików musiał obsłużyć wyjście.

ru_msgsnd (nieutrzymywane)
    W Linuksie, pole to jest aktualnie nieużywane.

ru_msgrcv (nieutrzymywane)
    W Linuksie, pole to jest aktualnie nieużywane.

ru_nsignals (nieutrzymywane)
    W Linuksie, pole to jest aktualnie nieużywane.

ru_nvcsw (od Linuksa 2.6)
    Liczba przypadków, w których wystąpiło przełączenie kontekstu, ze względu na dobrowolne zwolnienie procesora przez proces, przed wykorzystaniem jego jednostki czasu (zwykłe w celu oczekiwania na dostępność zasobu).

ru_nivcsw (od Linuksa 2.6)
    Liczba przypadków, w których wystąpiło przełączenie kontekstu, ze względu na pojawienie się działającego procesu o wyższym priorytecie lub ze względu na przekroczenie swojej jednostki czasu przez bieżący proces.

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
    usage wskazuje poza dostępną przestrzeń adresową.

EINVAL
    who jest nieprawidłowe.

ATRYBUTY
Informacje o pojęciach używanych w tym rozdziale można znaleźć w podręczniku attributes(7).
Interfejs | Atrybut | Wartość
getrusage() | Bezpieczeństwo wątkowe | MT-bezpieczne

STANDARDY
POSIX.1-2024.

POSIX.1 określa getrusage(), lecz opisuje jedynie pola ru_utime i ru_stime.

RUSAGE_THREAD jest typowo linuksowe.

HISTORIA
4.3BSD, SVr4, SUSv1, POSIX.1-2001 XSI.

Przed Linuksem 2.6.9, jeśli dyspozycję SIGCHLD ustawiono na SIG_IGN, to w wartości zwracanej przez RUSAGE_CHILDREN, automatycznie uwzględniane jest użycie zasobu przez procesy potomne, mimo że POSIX.1-2001 wyraźnie tego zabrania. Tę niezgodność ze standardem usunięto w Linuksie 2.6.9 i nowszych.

Definicję struktury pokazaną na początku niniejszego podręcznika zaczerpnięto z 4.3BSD Reno.

Bardzo stare systemy udostępniały funkcję vtimes() o podobnym przeznaczeniu co getrusage(). Ze względu na kompatybilność, glibc (do Linuksa 2.32) również dostarczał vtimes(). Wszystkie nowe aplikacje powinny być pisane z wykorzystaniem getrusage() (od Linuksa 2.33, glibc nie udostępnia już implementacji vtimes()).

UWAGI
Wskaźniki użycia zasobów są zachowywane przy execve(2).

ZOBACZ TAKŻE
clock_gettime(2), getrlimit(2), times(2), wait(2), wait4(2), clock(3), proc_pid_stat(5), proc_pid_io(5)

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