Provided by:
manpages-pl-dev_20051117-1_all 
NAZWA
getrlimit, getrusage, setrlimit - pobranie/ustawienie limitów i zużycia
zasobów
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
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.
ZOBACZ TAKŻE
dup(2), fcntl(2), fork(2), mlock(2), mlockall(2), mmap(2), open(2),
quotactl(2), sbrk(2), wait3(2), wait4(2), malloc(3), ulimit(3),
signal(7)