Provided by: manpages-pl-dev_4.23.1-1_all bug

NAZWA

       getrlimit, setrlimit, prlimit - pobiera/ustawia limity zasobów

BIBLIOTEKA

       Standardowa biblioteka C (libc, -lc)

SKŁADNIA

       #include <sys/resource.h>

       int getrlimit(int resource, struct rlimit *rlim);
       int setrlimit(int resource, const struct rlimit *rlim);

       int prlimit(pid_t pid, int resource,
                   const struct rlimit *_Nullable new_limit,
                   struct rlimit *_Nullable old_limit);

   Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)):

       prlimit():
           _GNU_SOURCE

OPIS

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

           struct rlimit {
               rlim_t rlim_cur;  /* ograniczenie miękkie */
               rlim_t rlim_max;  /* ogr. sztywne (górna granica rlim_cur) */
           };

       Ograniczenie   miękkie   jest   wartością  odpowiedniego  zasobu  wymuszoną  przez  jądro.
       Ograniczenie  sztywne  działa  jako  górna  granica  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  (w  Linuksie:  proces  z przywilejem CAP_SYS_RESOURCE (ang. capability) w
       swojej pierwotnej przestrzeni nazw użytkownika) 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()).

       Argument resource musi być jednym z:

       RLIMIT_AS
              Jest to maksymalny rozmiar  pamięci  wirtualnej  procesu  (przestrzeni  adresowej).
              Limit jest określony w bajtach i zaokrąglony w dół, do systemowego rozmiaru strony.
              Limit dotyczy wywołań do brk(2), mmap(2) i mremap(2), które po  jego  przekroczeniu
              zawiodą  z  błędem  ENOMEM. Dodatkowo, zawiedzie automatyczne rozszerzenie stosu (i
              wygeneruje sygnał SIGSEGV zabijający proces, jeśli  za  pomocą  sigaltstack(2)  nie
              stał się dostępny alternatywny stos).  Ze względu na to, że wartość ta ma typ long,
              na komputerach z 32-bitowym long limit ten wynosi co najwyżej 2 GiB lub  zasób  ten
              jest nieograniczony.

       RLIMIT_CORE
              Maksymalny  rozmiar pliku core (zob. core(5)) w bajtach, który może zrzucić proces.
              Wartość 0 oznacza, że pliki zrzutu nie są tworzone.  Gdy  wartość  jest  niezerowa,
              większe zrzuty są przycinane do wskazanego rozmiaru.

       RLIMIT_CPU
              Limit, w sekundach, czasu procesora (CPU), jaki może użyć proces. 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  do  programu  głównego.  Jeśli  proces
              nadal  będzie  używać  zasoby procesora, będzie do niego co sekundę wysyłany sygnał
              SIGXCPU aż do osiągnięcia ograniczenia sztywnego, kiedy  to  wysyłany  jest  sygnał
              SIGKILL.  (Ostatni  punkt opisuje zachowanie Linuksa. W zależności od implementacji
              procesy  kontynuujące  uż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 zainicjowane, dane niezainicjowane
              i sterta). Limit jest podawany w bajtach i jest zaokrąglany w dół,  do  systemowego
              rozmiaru  strony. Ograniczenie to wpływa na wywołania brk(2), sbrk(2) i (od Linuksa
              4.7) mmap(2), 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  w  bajtach,  jakie  może  utworzyć  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(2), truncate(2)) kończy się błędem
              EFBIG.

       RLIMIT_LOCKS (Linux 2.4.0 do Linuksa 2.4.24)
              Ograniczenie  łącznej  liczby  blokad  flock(2)  i  dzierżaw  fcntl(2),  które może
              ustanowić proces.

       RLIMIT_MEMLOCK
              Maksymalna liczba bajtów pamięci, które mogą być zablokowane w RAM.  Limit  jest  w
              praktyce  zaokrąglany  w  dół  do  najbliższej  wielokrotności systemowego rozmiaru
              strony. Limit dotyczy mlock(2), mlockall(2) oraz operacji  MAP_LOCKED  mmap(2).  Od
              Linuksa  2.6.9,  limit  dotyczy  również operacji SHM_LOCK shmctl(2), gdzie ustawia
              maksymalną sumę bajtów segmentów pamięci dzielonej (zob. shmget(2)), które mogą być
              zablokowane  przez  rzeczywisty  identyfikator  użytkownika  procesu  wywołującego.
              Blokady SHM_LOCK shmctl(2) są liczone  oddzielnie  od  blokad  pamięci  na  proces,
              ustanowionych  przez  mlock(2),  mlockall(2)  i  MAP_LOCKED  mmap(2);  proces  może
              zablokować bajty do tego limitu w każdej z tych dwóch kategorii.

              Przed Linuksem 2.6.9, limit ten  kontrolował  wielkość  pamięci,  która  mogła  być
              zablokowana  przez  proces  uprzywilejowany. Od Linuksa 2.6.9, na wielkość pamięci,
              jaka może być zablokowana przez proces uprzywilejowany nie są nakładane  limity,  a
              opisywany limit dotyczy w zamian procesów nieuprzywilejowanych.

       RLIMIT_MSGQUEUE (od Linuksa 2.6.8)
              Limit  liczby  bajtów,  które  mogą być przydzielone kolejkom komunikatów POSIX dla
              rzeczywistego identyfikatora  użytkownika  procesu  wywołującego.  Limit  ten  jest
              wymuszony na mq_open(3). Każda kolejka komunikatów, którą tworzy użytkownika wlicza
              się do tego limitu (do momentu jej usunięcia) zgodnie ze wzorem:

                  Od Linuksa 3.5:

                      bytes = attr.mq_maxmsg * sizeof(struct msg_msg) +
                              MIN(attr.mq_maxmsg, MQ_PRIO_MAX) *
                                    sizeof(struct posix_msg_tree_node)+
                                           /* Do narzutu */
                              attr.mq_maxmsg * attr.mq_msgsize;
                                           /* Do danych komunikatów */

                  Linux 3.4 i wcześniejsze:

                      bytes = attr.mq_maxmsg * sizeof(struct msg_msg *) +
                                           /* Do narzutu */
                              attr.mq_maxmsg * attr.mq_msgsize;
                                           /* Do danych komunikatów */

              gdzie attr jest strukturą mq_attr określoną jako czwarty argument do mq_open(3),  a
              struktury msg_msg i posix_msg_tree_node są wewnętrznymi strukturami jądra.

              Składowa  „narzutu”  we  wzorze  bierze  pod  uwagę  bajty  narzutu  wymagane przez
              implementację i zapewnia, że użytkownik  nie  może  utworzyć  nieskończonej  liczby
              komunikatów  o  zerowej  długości  (takie  komunikaty  wciąż  zajmują nieco pamięci
              systemowej ze względu na narzut księgowania).

       RLIMIT_NICE (od Linuksa 2.6.12, lecz zob. USTERKI poniżej)
              Określa górną granicę, do której można zwiększyć wartość  nice  procesu  za  pomocą
              setpriority(2)   lub   nice(2).  Rzeczywista  górna  granica  jest  obliczana  jako
              20 - rlim_cur. Użyteczny zakres  tego  limitu  wynosi  zatem  od  1  (co  odpowiada
              wartości  nice 19) do 40 (co odpowiada wartości nice -20). Ten nietypowy zakres był
              konieczny, ponieważ liczby ujemne nie mogą stanowić wartości limitów zasobów,  gdyż
              zwykle  mają  specjalne znaczenie. Na przykład RLIM_INFINITY jest zwykle równoważne
              -1. Więcej szczegółów na temat wartości nice można znaleźć w podręczniku sched(7).

       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 (open(), pipe(), dup() itd.)  przekroczenia tego
              limitu dają błąd EMFILE (historycznie limit ten nosił nazwę RLIMIT_OFILE na BSD).

              Od Linuksa 4.5, limit ten definiuje również maksymalną liczbę  deskryptorów  pliku,
              jakie proces nieuprzywilejowany (bez przywileju CAP_SYS_RESOURCE (ang. capability))
              może mieć „w locie” do innych procesów, przy przekazywaniu za pomocą gniazd  domeny
              Uniksa.  Limit  ten  dotyczy  wywołania systemowego sendmsg(2). Więcej szczegółów w
              podręczniku unix(7).

       RLIMIT_NPROC
              Limit liczby istniejących procesów  (lub,  precyzyjniej  w  Linuksie,  wątków)  dla
              rzeczywistego   identyfikatora   użytkownika  procesu  wywołującego.  Jeśli  liczba
              bieżących procesów, będących własnością  rzeczywistego  identyfikatora  użytkownika
              tego procesu, jest większa lub równa limitowi, fork() zawiedzie z błędem EAGAIN.

              Limit  RLIMIT_NPROC nie jest wymuszany na procesach z przywilejem CAP_SYS_ADMIN lub
              CAP_SYS_RESOURCE (ang.  capability)  i  procesach  z  rzeczywistym  identyfikatorem
              użytkownika równym 0.

       RLIMIT_RSS
              Limit  (w  bajtach)  rezydentnych  stron  procesu  (liczba stron pamięci wirtualnej
              pozostających w RAM). Ograniczenie to działa tylko w Linuksie 2.4.x, gdzie x <  30,
              i dotyczy jedynie wywołań madvise(2) z użyciem MADV_WILLNEED.

       RLIMIT_RTPRIO (od Linuksa 2.6.12, lecz zob. USTERKI)
              Górna  granica,  jaką  można ustawić dla priorytetu czasu rzeczywistego, dla danego
              procesu, za pomocą sched_setscheduler(2) i sched_setparam(2).

              Więcej informacji o politykach szeregowania zadań  czasu  rzeczywistego  opisano  w
              podręczniku sched(7).

       RLIMIT_RTTIME (od Linuksa 2.6.25)
              Limit  (w  mikrosekundach) czasu procesora, jaki proces korzystający z szeregowania
              zadań  czasu  rzeczywistego  może  użyć,  bez   czynienia   blokującego   wywołania
              systemowego.  Do  celu  tego  limitu,  za każdym razem, gdy proces tworzy blokujące
              wywołanie systemowe, licznik użytego  czasu  procesora  jest  resetowany  do  zera.
              Licznik  czasu  procesora nie jest resetowany, jeśli proces kontynuuje próbę użycia
              procesora, lecz jest wywłaszczony, przydzielona mu jednostka czasu  wyczerpała  się
              lub wywoła sched_yield(2).

              Po  osiągnięciu  limitu  miękkiego,  do procesu wysyłany jest sygnał SIGXCPU. Jeśli
              proces go przechwyci lub zignoruje i będzie kontynuował używanie  czasu  procesora,
              sygnał  SIGXCPU  będzie  generowany  co  sekundę,  do  momentu  osiągnięcia  limitu
              sztywnego, gdy proces otrzyma sygnał SIGKILL.

              Limit ten ma na celu zapobiegnięcie  zablokowania  systemu  przez  zbiegłe  procesy
              czasu rzeczywistego.

              Więcej  informacji  o  politykach  szeregowania zadań czasu rzeczywistego opisano w
              podręczniku sched(7).

       RLIMIT_SIGPENDING (od Linuksa 2.6.8)
              Limit  liczby  sygnałów,   jakie   mogą   być   zakolejkowane   dla   rzeczywistego
              identyfikatora  użytkownika  procesu  wywołującego. Do celu sprawdzania tego limitu
              liczą się sygnały zwykłe i czasu rzeczywistego. Limit jest jednak wymuszany jedynie
              dla  sigqueue(3);  można  zawsze skorzystać z kill(2), aby zakolejkować po jednym z
              każdego sygnału, który nie występuje w kolejce do procesu.

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

              Od Linuksa 2.6.23, limit ten określa  również  wielkość  przestrzeni  używanej  dla
              argumentów   wiersza   polecenia  oraz  zmiennych  środowiskowych  procesu;  więcej
              szczegółów w podręczniku execve(2).

   prlimit()
       Typowo  linuksowe  wywołanie  systemowe  prlimit()  łączy   i   rozszerza   funkcjonalność
       setrlimit()  i  getrlimit().  Można  go  używać  do  ustawienia i pobrania limitów zasobów
       dowolnego procesu.

       Argument resource ma takie samo znaczenie jak w przypadku setrlimit() i getrlimit().

       Jeśli argument new_limit nie wynosi NULL, to struktura rlimit, na którą on wskazuje,  jest
       używana  do  ustawienia  nowych  wartości  limitów  miękkich  i  sztywnych resource. Jeśli
       argument old_limit nie wynosi NULL, to pomyślne wywołanie prlimit()  umieszcza  poprzednie
       limity miękkie i sztywne resource w strukturze rlimit, na którą wskazuje old_limit.

       Argument  pid  określa  identyfikator  procesu, na którym wywołanie ma operować. Jeśli pid
       wynosi 0, to wywołanie stosuje się do procesu wywołującego. Aby ustawić lub pobrać  zasoby
       procesu   innego  niż  własny,  wywołujący  musi  mieć  przywilej  CAP_SYS_RESOURCE  (ang.
       capability) w przestrzeni nazw użytkownika procesu, którego limity  zasobów  są  zmieniane
       lub  identyfikatory:  rzeczywisty,  efektywny  i  zapisany  suid  procesu docelowego muszą
       odpowiadać  identyfikatorowi  rzeczywistemu  procesu  wywołującego  oraz   identyfikatory:
       rzeczywisty,  efektywny  i zapisany suid procesu docelowego muszą odpowiadać rzeczywistemu
       identyfikatorowi grupy wywołującego.

WARTOŚĆ ZWRACANA

       W przypadku powodzenia, te wywołania zwracają 0. W razie wystąpienia błędu  zwracane  jest
       -1 i ustawiane errno, wskazując błąd.

BŁĘDY

       EFAULT Argument wskaźnika wskazuje na położenie poza dostępną przestrzeń adresową.

       EINVAL WArtość  określona  w  resource nie jest prawidłowa; albo — w przypadku setrlimit()
              lub prlimit(): rlim->rlim_cur był większy niż rlim->rlim_max.

       EPERM  Proces nieuprzywilejowany próbował  zwiększyć  limit  sztywny;  do  dokonania  tego
              konieczny jest przywilej CAP_SYS_RESOURCE (ang. capability).

       EPERM  Wywołujący  próbował zwiększyć limit sztywny RLIMIT_NOFILE ponad wartość maksymalną
              określoną w /proc/sys/fs/nr_open (zob. proc(5))

       EPERM  (prlimit())  Proces wywołujący nie miał uprawnień do ustawiania limitów dla procesu
              podanego w pid.

       ESRCH  Nie udało się znaleźć procesu o identyfikatorze podanym w pid.

ATRYBUTY

       Informacje   o   pojęciach   używanych   w  tym  rozdziale  można  znaleźć  w  podręczniku
       attributes(7).

       ┌────────────────────────────────────────────────┬────────────────────────┬───────────────┐
       │InterfejsAtrybutWartość       │
       ├────────────────────────────────────────────────┼────────────────────────┼───────────────┤
       │getrlimit(), setrlimit(), prlimit()             │ Bezpieczeństwo wątkowe │ MT-bezpieczne │
       └────────────────────────────────────────────────┴────────────────────────┴───────────────┘

STANDARDY

       getrlimit()
       setrlimit()
              POSIX.1-2008.

       prlimit()
              Linux.

       RLIMIT_MEMLOCK i RLIMIT_NPROC pochodzą z BSD i nie są określone w  POSIX.1;  są  obecne  w
       systemach BSD i Linux, ale z różnymi implementacjami. RLIMIT_RSS pochodzi z BSD i nie jest
       określone w POSIX.1; jest jednak  obecne  w  większości  implementacji.   RLIMIT_MSGQUEUE,
       RLIMIT_NICE, RLIMIT_RTPRIO, RLIMIT_RTTIME i RLIMIT_SIGPENDING są typowo linuksowe.

HISTORIA

       getrlimit()
       setrlimit()
              POSIX.1-2001, SVr4, 4.3BSD.

       prlimit()
              Linux 2.6.36, glibc 2.13.

UWAGI

       Proces  potomny  utworzony  za  pomocą  fork(2)  dziedziczy limity zasobów swojego procesu
       macierzystego. Limity zasobów są zachowywane przez execve(2).

       Limity zasobów są atrybutami przypisanymi procesowi i są dzielone  przez  wszystkie  wątki
       procesu.

       Zmniejszenie miękkiego limitu zasobu poniżej jego aktualnego użycia przez proces powiedzie
       się (lecz zapobiegnie dalszemu zwiększeniu użycia zasobu przez proces).

       Można ustawić limity zasobów powłoki za  pomocą  wbudowanego  polecenia  ulimit  (limit  w
       csh(1)).  Limity  zasobów  powłoki  są  dziedziczone przez procesy tworzone do wykonywania
       poleceń powłoki.

       Od  Linuksa  2.6.24,  limity  zasobów  dowolnego  procesu  można   sprawdzić   za   pomocą
       /proc/pid/limits; zob. proc(5).

       Dawne  systemy  udostępniały  funkcję  vlimit() o podobnym zastosowaniu do setrlimit(). Ze
       względu na kompatybilność wsteczną, glibc  również  udostępnia  vlimit().  Wszystkie  nowe
       aplikacje powinny używać wyłącznie setrlimit().

   Różnice ABI biblioteki C/jądra
       Od  glibc  2.13,  funkcje opakowujące getrlimit() i setrlimit() z glibc nie przywołują już
       odpowiadających im wywołań systemowych, lecz używają prlimit(), ze  względów  opisanych  w
       USTERKACH.

       Nazwą  opakowującej  funkcji  z  glibc  jest  prlimit();  nazwą wywołania systemowego jest
       prlimit64().

USTERKI

       W starszych jądrach Linux, sygnały SIGXCPU i  SIGKILL  dostarczane,  gdy  proces  napotkał
       miękkie  i sztywne limity RLIMIT_CPU, dostarczano jedną sekundę (procesorową) później, niż
       powinno to nastąpić. Poprawiono to w Linuksie 2.6.8.

       W jądrach Linux 2.6.x wcześniejszych niż Linux 2.6.17, limit RLIMIT_CPU  wynoszący  0  był
       nieprawidłowo  traktowany  jako  „brak  limitu”  (jak  RLIM_INFINITY).  Od Linuksa 2.6.17,
       ustawienie limitu 0 jest stosowane, ale faktycznie skutkuje limitem 1 sekundy.

       Błąd jądra powodował, że RLIMIT_RTPRIO nie działał w Linuksie 2.6.12; problem poprawiono w
       Linuksie 2.6.13.

       W  Linuksie 2.6.12, istniała niezgodność o jeden pomiędzy zakresami priorytetów zwracanymi
       przez getpriority(2) i RLIMIT_NICE. Dawało te efekt, że faktyczna górna  granica  wartości
       nice była obliczana jako 19 - rlim_cur. Poprawiono to w Linuksie 2.6.13.

       Od  Linuksa  2.6.12,  jeśli proces osiąga swój miękki limit RLIMIT_CPU i posiada procedurę
       obsługi SIGXCPU, to, oprócz przywołania procedury obsługi, jądro zwiększa miękki  limit  o
       jedną  sekundę.  Zachowanie  to  powtarza  się,  jeśli  proces  kontynuuje  używanie czasu
       procesora,  aż  do  osiągnięcia  limitu  sztywnego,  gdy  proces   jest   zabijany.   Inne
       implementacje nie zmieniają miękkiego limitu RLIMIT_CPU w ten sposób, a zachowanie Linuksa
       prawdopodobnie  nie  jest  zgodne  ze  standardami;  przenośne  aplikacje  powinny  unikać
       polegania na tym typowo linuksowym zachowaniu. Typowo linuksowy limit RLIMIT_RTTIME działa
       w ten sam sposób, gdy osiągnie się miękki limit.

       Jądra przed Linuksem 2.4.22 nie diagnozują  błędu  EINVAL  w  przypadku  setrlimit(),  gdy
       rlim->rlim_cur było większe niż rlim->rlim_max.

       Ze  względu  na  kompatybilność,  Linux  nie zwraca błędu, gdy próba ustawienia RLIMIT_CPU
       zawodzi.

   Reprezentacja „dużych” wartości limitu zasobu na platformach 32-bitowych
       Funkcje opakowujące getrlimit() i setrlimit() z  glibc  używają  64-bitowego  typu  danych
       rlim_t, nawet na platformach 32-bitowych. Jednakże typ danych rlim_t używany w wywołaniach
       systemowych getrlimit() i setrlimit()  jest  (32-bitowym)  unsigned  long.  Co  więcej,  w
       Linuksie  jądro  reprezentuje limit zasobów na platformach 32-bitowych jako unsigned long.
       Jednak 32-bitowy typ  danych  nie  jest  wystarczająco  szeroki.  Najtrudniejsza  sytuacja
       występuje  odnośnie  limitu RLIMIT_FSIZE określającego maksymalny rozmiar, do jakiego może
       zostać zwiększony plik: aby być użytecznym, limit ten musi być reprezentowany  przez  typ,
       który  jest  tak  szeroki,  jak  typ  używany  do reprezentowania przesunięć pliku tj. tak
       szeroki jak 64-bitowe off_t (zakładając, że program skompilowano z _FILE_OFFSET_BITS=64).

       Aby obejść to ograniczenie, w przypadku gdy program  próbował  ustawić  limit  zasobów  na
       wartość   większą  niż  może  być  reprezentowana  w  32-bitowym  unsigned  long,  funkcja
       opakowująca setrlimit() z glibc po cichu konwertowała  wartość  limitu  na  RLIM_INFINITY.
       Innymi słowy, żądany limit zasobów był po cichu ignorowany.

       OD   glibc  2.13,  glibc  obchodzi  to  ograniczenie  wywołań  systemowych  getrlimit()  i
       setrlimit() implementując setrlimit() i getrlimit() jako  funkcje  opakowujące  wywołujące
       prlimit().

PRZYKŁADY

       Poniższy program demonstruje użycie prlimit().

       #define _GNU_SOURCE
       #define _FILE_OFFSET_BITS 64
       #include <err.h>
       #include <stdint.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <sys/resource.h>
       #include <time.h>

       int
       main(int argc, char *argv[])
       {
           pid_t          pid;
           struct rlimit  old, new;
           struct rlimit  *newp;

           if (!(argc == 2 || argc == 4)) {
               fprintf(stderr, "Użycie: %s <pid> [<nowy-limit-miękki> "
                       "<nowy-limit-sztywny>]\n", argv[0]);
               exit(EXIT_FAILURE);
           }

           pid = atoi(argv[1]);        /* PID procesu docelowego */

           newp = NULL;
           if (argc == 4) {
               new.rlim_cur = atoi(argv[2]);
               new.rlim_max = atoi(argv[3]);
               newp = &new;
           }

           /* Ustawia limit czasu procesora procesu docelowego; pobiera
              i wyświetla poprzedni limit */

           if (prlimit(pid, RLIMIT_CPU, newp, &old) == -1)
               err(EXIT_FAILURE, "prlimit-1");
           printf("Poprzednie limity: miękki=%jd; sztywny=%jd\n",
                  (intmax_t) old.rlim_cur, (intmax_t) old.rlim_max);

           /* Pobiera i wyświetla nowy limit czasu procesora */

           if (prlimit(pid, RLIMIT_CPU, NULL, &old) == -1)
               err(EXIT_FAILURE, "prlimit-2");
           printf("Nowe limity: miękki=%jd; sztywny=%jd\n",
                  (intmax_t) old.rlim_cur, (intmax_t) old.rlim_max);

           exit(EXIT_SUCCESS);
       }

ZOBACZ TAKŻE

       prlimit(1),   dup(2),   fcntl(2),   fork(2),  getrusage(2),  mlock(2),  mmap(2),  open(2),
       quotactl(2),   sbrk(2),   shmctl(2),   malloc(3),   sigqueue(3),    ulimit(3),    core(5),
       capabilities(7), cgroups(7), credentials(7), signal(7)

TŁUMACZENIE

       Autorami   polskiego   tłumaczenia   niniejszej   strony  podręcznika  są:  Przemek  Borys
       <pborys@dione.ids.pl>, Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl> i  Michał  Kułach
       <michal.kulach@gmail.com>

       Niniejsze  tłumaczenie  jest  wolną  dokumentacją. Bliższe informacje o warunkach licencji
       można   uzyskać   zapoznając   się   z   GNU   General   Public   License   w   wersji   3
       ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩   lub   nowszej.   Nie  przyjmuje  się  ŻADNEJ
       ODPOWIEDZIALNOŚCI.

       Błędy w tłumaczeniu  strony  podręcznika  prosimy  zgłaszać  na  adres  listy  dyskusyjnej
       ⟨manpages-pl-list@lists.sourceforge.net⟩.