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