getrlimit

Autres langues

Langue: pl

Autres versions - même langue

Version: 2002-07-09 (openSuse - 09/10/07)

Section: 2 (Appels système)

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)