Provided by: manpages-pl-dev_20051117-1_all bug

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)