setrlimit(2) pobranie/ustawienie limitów i zużycia zasobów

Other Alias

getrlimit, getrusage

SKŁADNIA

#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>

int getrlimit(int resource, struct rlimit *rlim);
int getrusage(int who, struct rusage *usage);
int setrlimit(int resource, const struct rlimit *rlim);

OPIS

Uwaga! To tłumaczenie może być nieaktualne!

getrlimit i setrlimit odpowiednio pobierają i ustawiają limity zasobów. Z każdym z zasobów stowarzyszone jest miękkie i sztywne ograniczenie zdefiniowane w strukturze rlimit (argument rlim w getrlimit() i setrlimit()):

struct rlimit {
    rlim_t rlim_cur;   /* ograniczenie miękkie */
    rlim_t rlim_max;   /* ograniczenie sztywne (górna
                          granica dla rlim_cur) */
};
Ograniczenie miękkie jest wartością odpowiedniego zasoby wymuszną przez jądro. Ograniczenie sztywne działa jak wartość maksymalna dla ograniczenia miękkiego: proces nieuprzywilejowany może sobie ustawić ograniczenie miękkie tylko w zakresie od 0 do ograniczenia sztywnego oraz (nieodwracalnie) obniżyć swoje ograniczenie sztywne. Proces uprzywilejowany może dowolnie zmieniać każdą z wartości ograniczenia.

Wartość RLIM_INFINITY określa brak ograniczenia dla zasobu (zarówno w strukturze zwracanej przez getrlimit(), jak i w strukturze przekazywanej do setrlimit()).

resource musi być jednym z:

RLIMIT_CPU
Ograniczenie czasu procesora (CPU) w sekundach. Gdy proces osiąga swoje ograniczenie miękkie, jest do niego wysyłany sygnał SIGXCPU. Domyślną reakcją na ten sygnał jest przerwanie procesu. Jednakże, sygnał może zostać przechwycony i procedura obsługi może przekazać sterowanie to programu głównego. Jeśli proces nadal będzie zużywać zasoby procesora, będzie do niego co sekundę wysyłany sygnał SIGXCPU aż do osiągnięcia ograniczenia sztywnego, kiedy to wysyłane jest sygnał SIGKILL. (Ostatni punkt opisuje zachowanie Linuksa 2.2 i 2.4. W zależności od implementacji procesy kontynuujące zużywanie zasobów procesora po osiągnięciu ograniczenia miękkiego są różnie traktowane. Aplikacje przenośne, które mają potrzebę przechwycenia tego sygnału, powinny zakończyć się w sposób kontrolowany w chwili otrzymaniu pierwszego SIGXCPU.)
RLIMIT_DATA
Maksymalny rozmiar segmentu danych procesu (dane zainicjalizowane, dane niezainicjalizowane i sterta). Ograniczenie to wpływa na wywołania brk() and sbrk(), które kończą się niepomyślnie, zgłaszając błąd ENOMEM w momencie natrafienia na miękkie ograniczenie tego zasobu.
RLIMIT_FSIZE
Maksymalny rozmiar plików tworzonych przrz dany proces. Próba rozszerzenia pliku ponad to ograniczenie kończy się otrzymaniem sygnału SIGXFSZ. Domyślnie, sygnał ten kończy działanie procesu, ale proces może go przechwycić. Wówczas odpowiednia funkcja systemowa (np. write(), truncate()) kończy się błędem. EFBIG.
RLIMIT_LOCKS
Ograniczenie łącznej liczby blokad flock() i dzierżaw fcntl(), które proces może ustanowić (Linux 2.4 i późniejsze).
RLIMIT_MEMLOCK
Maksymalna liczba bajtów pamięci wirtualnej, które można zablokować w pamięci RAM za pomocą mlock() i mlockall().
RLIMIT_NOFILE
Określa wartość o jeden większą niż maksymalna liczba deskryptorów plików, które dany proces może otworzyć. Próby wykonania (open(), pipe(), dup(), itd.) przekraczające tę granicę dają błąd EMFILE.
RLIMIT_NPROC
Maksymalna liczba procesów, które można utworzyć dla danego rzeczywistego identyfikatora użytkownika procesu wywołującego. Po napotkaniu tego ograniczenia, fork() kończy się błędem EAGAIN.
RLIMIT_RSS
Określa ograniczenie ilości rezydentnych stron procesu (liczba stron pamięci wirtualnej pozostających w RAM). Ograniczenie to działa począwszy od Linuksa 2.4 i dotyczy jedynie wywołań madvise() z użyciem MADVISE_WILLNEED.
RLIMIT_STACK
Maksymalny rozmiar stosu procesu w bajtach. W chwili osiągnięcia tego ograniczenia, generowany jest sygnał SIGSEGV. W celu obsłużenia tego sygnału proces musi założyć alternatywny stos dla sygnałów (sigaltstack(2)).

RLIMIT_OFILE jest nazwą BSD dla RLIMIT_NOFILE.

getrusage zwraca bieżące zużycie zasobów dla who będącego albo RUSAGE_SELF albo RUSAGE_CHILDREN. W pierwszym przypadku zwracane jest zużycie zasobów przez bieżący proces, a w dugim - przez tych spośród jego potomków, którzy zakończyli działanie i na które to zakończenie oczekiwano.

struct rusage {
    struct timeval ru_utime; /* użyty czas użytkownika */
    struct timeval ru_stime; /* użyty czas systemowy */
    long   ru_maxrss;        /* maximum resident set size */
    long   ru_ixrss;         /* całkowity rozmiar pamięci dzielonej */
    long   ru_idrss;         /* całkowity rozmiar danych niedzielonych */
    long   ru_isrss;         /* całkowity rozmiar niedzielonego stosu */
    long   ru_minflt;        /* page reclaims */
    long   ru_majflt;        /* page faults */
    long   ru_nswap;         /* swapy */
    long   ru_inblock;       /* blokowe operacje wejścia */
    long   ru_oublock;       /* blokowe operacje wyjścia */
    long   ru_msgsnd;        /* wysłane komunikaty */
    long   ru_msgrcv;        /* otrzymane komunikaty */
    long   ru_nsignals;      /* otrzymane sygnały */
    long   ru_nvcsw;         /* ochotnicze przełączenia kontekstu */
    long   ru_nivcsw;        /* nieochotnicze przełączenia kontekstu */
};

WARTOŚĆ ZWRACANA

Po pomyślnym zakończeniu zwracane jest 0. Po błędzie zwracane jest -1 i odpowiednio ustawiane errno.

BŁĘDY

EFAULT
rlim lub usage wskazuje poza dostępną przestrzeń adresową.
EINVAL
getrlimit lub setrlimit zostało wywołane ze złym resource, lub też getrusage zostało wywołane ze złym who.
EPERM
Użytkownik nie będący superużytkownikiem próbuje używać setrlimit() do zwiększenia miękich lub twardych limitów, lub też superużytkownik próbuje zwiększyć RLIMIT_NOFILE powyżej maksimum jądra.

ZGODNE Z

SVr4, BSD 4.3

UWAGA

Włączenie <sys/time.h> nie jest obecnie wymagane, ale zwiększa przenośność. (Rzeczywiście, struct timeval jest zdefiniowane w <sys/time.h>.)

W Linuksie, jeśli rozporządzenie SIGCHLD ustawiono jako SIG_IGN, to zasobów wykorzystywane przez procesy potomne są automatycznie dołączane do wartości zwracanej przez RUSAGE_CHILDREN, pomimo że POSIX 1003.1-2001 jawnie tego zabrania.

Powyższa struktura została przejęta z BSD 4.3 Reno. Nie wszystkie pola mają znaczenie pod Linuksem. Obecnie (Linux 2.4) jedynie pola ru_utime, ru_stime, ru_minflt, ru_majflt i ru_nswap są pielęgnowane.

INFORMACJE O TŁUMACZENIU

Powyższe tłumaczenie pochodzi z nieistniejącego już Projektu Tłumaczenia Manuali i może nie być aktualne. W razie zauważenia różnic między powyższym opisem a rzeczywistym zachowaniem opisywanego programu lub funkcji, prosimy o zapoznanie się z oryginalną (angielską) wersją strony podręcznika za pomocą polecenia:
man --locale=C 2 getrlimit

Prosimy o pomoc w aktualizacji stron man - więcej informacji można znaleźć pod adresem http://sourceforge.net/projects/manpages-pl/.