Provided by: manpages-fr-dev_3.65d1p1-1_all bug

NOM

       getrlimit, setrlimit, prlimit - Lire et écrire les limites et utilisations des ressources

SYNOPSIS

       #include <sys/time.h>
       #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 *new_limit,
        struct rlimit *old_limit);

   Exigences de macros de test de fonctionnalités pour la glibc (consultez feature_test_macros(7)) :

       prlimit() : _GNU_SOURCE && _FILE_OFFSET_BITS == 64

DESCRIPTION

       Les  appels  système  getrlimit()  et  setrlimit() lisent ou écrivent les limites des ressources système.
       Chaque ressource a une limite souple et une limite stricte définies par la structure  rlimit  (l'argument
       rlim de getrlimit() et setrlimit()) :

           struct rlimit {
             rlim_t rlim_cur; /* limite souple */
             rlim_t rlim_max; /* limite stricte (plafond
                                 de rlim_cur) */
           };

       La  limite  souple est la valeur que le noyau prend en compte pour la ressource correspondante. La limite
       stricte agit comme un plafond pour la limite souple : un processus non privilégié peut seulement modifier
       sa limite souple dans l'intervalle entre zéro et la limite stricte, et diminuer (de manière irréversible)
       sa limite stricte. Un processus privilégié (sous Linux : un processus ayant la capacité CAP_SYS_RESOURCE)
       peut modifier ses deux limites à sa guise.

       La  valeur  RLIM_INFINITY  indique  une limite infinie pour la ressource (aussi bien pour getrlimit() que
       pour setrlimit()).

       Le paramètre resource doit être l'un des éléments suivants :

       RLIMIT_AS
              Taille maximum de la mémoire virtuelle du processus en octets. Cette limite affecte les  appels  à
              brk(2),  mmap(2)  et  mremap(2),  qui échouent avec l'erreur ENOMEM en cas de dépassement de cette
              limite. De même, l'extension de la pile automatique échouera (et générera un SIGSEGV qui tuera  le
              processus  si  aucune  pile alternative n'a été définie par un appel à sigaltstack(2)). Depuis que
              cette valeur est de type long, sur les machines où le type long est sur 32 bits, soit cette limite
              est au plus 2 GiB, soit cette ressource est illimitée.

       RLIMIT_CORE
              Taille  maximum  du  fichier  core. Lorsqu'elle vaut zéro, aucun fichier d'image noyau (Ndt : core
              dump) n'est créé. Lorsqu'elle ne vaut pas zéro,  les  fichiers  d'image  noyau  plus  grands  sont
              tronqués à cette taille.

       RLIMIT_CPU
              Limite  de temps CPU en secondes. Si un processus atteint cette limite souple, il reçoit le signal
              SIGXCPU. L'action par défaut pour ce signal est la terminaison du processus. Mais le  signal  peut
              être  capturé  et  le gestionnaire peut rendre le contrôle au programme principal. Si le processus
              continue à consommer du temps CPU, il recevra SIGXCPU toutes les  secondes  jusqu'à  atteindre  la
              limite  stricte,  où  il  recevra  SIGKILL. (Ce dernier point décrit le comportement de Linux. Les
              implémentations varient sur la façon de traiter le processus qui continue à consommer du temps CPU
              après  dépassement  de sa limite souple. Les applications portables qui doivent capturer ce signal
              devraient prévoir une terminaison propre dès la première réception de SIGXCPU.)

       RLIMIT_DATA
              Taille maximale du segment de données d'un processus (données initialisées, non  initialisées,  et
              tas).  Cette  limite affecte les appels brk(2) et sbrk(2), qui échouent avec l'erreur ENOMEM si la
              limite souple est dépassée.

       RLIMIT_FSIZE
              Taille maximale d'un fichier que le processus peut créer. Les tentatives d'extension d'un  fichier
              au‐delà de cette limite résultent en un signal SIGXFSZ. Par défaut ce signal termine le processus,
              mais il peut être capturé, et  dans  ce  cas  l'appel  système  concerné  (par  exemple  write(2),
              truncate(2)) échoue avec l'erreur EFBIG.

       RLIMIT_LOCKS (Premiers Linux 2.4 seulement)
              Une limite sur le nombre combiné de verrous flock(2) et fcntl(2) que le processus peut établir.

       RLIMIT_MEMLOCK
              Le  nombre  maximal  d'octets  de  mémoire  virtuelle que le processus peut verrouiller en RAM. En
              pratique cette limite est arrondie vers le bas au multiple de la taille de page  le  plus  proche.
              Cette  limite  affecte mlock(2) et mlockall(2) ainsi que l'opération MAP_LOCKED de mmap(2). Depuis
              Linux 2.6.9, elle affecte aussi l'opération SHM_LOCK de shmctl(2), où elle limite le nombre  total
              d'octets  dans  des segments de mémoire partagée (consultez shmget(2)) que l'UID réel du processus
              appelant peut verrouiller. Les verrous de shmctl(2) SHM_LOCK sont comptés séparément  des  verrous
              de  mémoire  par  processus établis par mlock(2), mlockall(2) et mmap(2) MAP_LOCKED ; un processus
              peut verrouiller des octets jusqu'à la limite dans chacune de  ces  catégories.  Dans  les  noyaux
              antérieurs  à  2.6.9,  cette  limite  contrôlait la quantité de mémoire qu'un processus privilégié
              pouvait verrouiller. Depuis Linux 2.6.9,  un  processus  privilégie  peut  verrouiller  autant  de
              mémoire  qu'il  le  souhaite,  et  cette  limite  contrôle  la  quantité  de  mémoire pouvant être
              verrouillée par un processus non privilégié.

       RLIMIT_MSGQUEUE (depuis Linux 2.6.8)
              Indique la limite du nombre d'octets pouvant être alloués pour les files de  messages  POSIX  pour
              l'UID  réel  du processus appelant. Cette limite est appliquée pour mq_open(3). Le nombre d'octets
              pour chaque file de messages créée par l'utilisateur (jusqu'à sa destruction) est déterminé par la
              formule suivante :

                 octets = attr.mq_maxmsg * sizeof(struct msg_msg *) +
                          attr.mq_maxmsg * attr.mq_msgsize

              où attr est la structure mq_attr passée comme quatrième argument à mq_open(3).

              Le  premier  terme  de  la  formule, qui inclut sizeof(struct msg_msg *) (4 octets sur Linux/i386)
              garantit que l'utilisateur ne peut pas créer un nombre illimité de messages  vides  (ces  messages
              consomment tout de même de la mémoire système).

       RLIMIT_NICE (depuis Linux 2.6.12, consultez la section BOGUES ci‐dessous)
              Indique   un  plafond  pour  la  valeur  de  politesse  du  processus  pouvant  être  définie  par
              setpriority(2) ou nice(2). Le plafond réel pour la valeur de politesse est calculé par la  formule
              20 - rlim_cur.  (Cette  bizarrerie  apparaît car des nombres négatifs ne peuvent pas être utilisés
              comme limites de ressources, en raison de leur signification souvent  particulière.  Par  exemple,
              RLIM_INFINITY est souvent la même chose que -1.)

       RLIMIT_NOFILE
              Le  nombre  maximal  de  descripteurs  de  fichier  qu'un processus peut ouvrir simultanément. Les
              tentatives d'ouverture (open(2), pipe(2), dup(2), etc) dépassant cette limite renverront  l'erreur
              EMFILE. Historiquement, cette limite était appelée RLIMIT_OFILE sur les BSD.

       RLIMIT_NPROC
              Le  nombre  maximal  de  processus  (ou plus précisément, sous Linux, de threads) qui peuvent être
              créés pour l'UID réel du processus appelant. Une fois cette limite atteinte, fork(2)  échoue  avec
              l'erreur EAGAIN.

       RLIMIT_RSS
              Indique  la  limite  (en  pages)  pour la taille de l'ensemble résident du processus (le nombre de
              pages de mémoire virtuelle en RAM). Cette limite n'a d'effet que sous Linux 2.4.x  où  x < 30,  et
              n'affecte que les appels madvise(2) indiquant MADV_WILLNEED.

       RLIMIT_RTPRIO (depuis Linux 2.6.12, mais consultez BOGUES)
              Indique  un  plafond  pour  la  priorité  temps‐réel  pouvant  être  appliquée  au  processus  par
              sched_setscheduler(2) et sched_setparam(2).

       RLIMIT_RTTIME (depuis Linux 2.6.25)
              Indique une limite de la quantité de temps (en microsecondes) CPU qu'un processus  ordonnancé  par
              une  politique  d'ordonnancement  temps  réel peut consommer sans bloquer lors de l'exécution d'un
              appel système. À cause de cette limite le décompte du temps CPU qu'il a consommé est remis à  zéro
              à  chaque  fois  qu'un processus exécute un appel système bloquant. Le décompte du temps CPU n'est
              pas remis à zéro si le processus continue d'essayer d'utiliser le CPU mais est préempté, ou si  sa
              tranche de temps expire, ou s'il appelle sched_yield(2).

              Quand  la  limite  douce  est atteinte, un signal SIGXCPU est envoyé au processus. Si le processus
              attrape ou ignore ce signal et continue à consommer du temps CPU, alors  un  signal  SIGXCPU  sera
              généré  une fois par seconde jusqu'à ce que la limite dure soit atteinte, ce qui provoque l'envoie
              d'un signal SIGKILL au processus.

              L'objectif de cette limite est d'empêcher un processus temps réel fou de bloquer le système.

       RLIMIT_SIGPENDING (depuis Linux 2.6.8)
              Spécifie la limite du nombre de signaux pouvant être mis en attente pour l'identifiant utilisateur
              réel  du processus appelant. La vérification de cette limite prend en compte à la fois les signaux
              classiques  et  les  signaux  temps‐réel.  Cependant,  cette  limite  n'est  appliquée  que   pour
              sigqueue(3) ;  il  est toujours possible d'utiliser kill(2) pour mettre en attente une instance de
              tout signal qui n'est pas déjà en attente pour le processus.

       RLIMIT_STACK
              La taille maximale de la pile du processus, en octets. Une fois cette limite atteinte,  un  signal
              SIGSEGV  est  déclenché. Pour gérer ce signal, le processus doit utiliser une pile spécifique pour
              signaux (sigaltstack(2)).

              Depuis Linux 2.6.23, cette limite détermine  également  la  quantité  d'espace  utilisé  pour  les
              paramètres  et  les  variables  d'environnement  du  processus ;  consultez execve(2) pour plus de
              détails.

   prlimit()
       L'appel système prlimit()  spécifique à Linux combine et étend les  fonctionnalités  de  setrlimit()   et
       getrlimit(). Il peut être utilisé pour affecter ou récupérer les limites de ressources de tout processus.

       Le paramètre resource a le même sens que dans setrlimit()  et getrlimit().

       Si  le  paramètre  new_limit  ne  vaut  pas  NULL,  alors la structure rlimit vers laquelle il pointe est
       utilisée pour affecter de nouvelles valeurs  aux  limites  souples  et  strictes  pour  resource.  Si  le
       paramètres  old_limit  ne  vaut  pas  NULL,  alors  un  appel  à prlimit()  qui réussit place les limites
       antérieures souples et strictes pour resource dans la structure rlimit pointée par old_limit.

       L'argument pid spécifie l'identifiant du processus sur lequel l'appel agit. Si pid vaut 0, alors  l'appel
       s'applique  au processus appelant. Pour positionner ou interroger les ressources d'un processus autre que
       lui-même, soit l'appelant a la capacité CAP_SYS_RESOURCE, soit les  identifiants  d'utilisateur  réel  et
       effectif  et  le  set-UID  sauvé  du  processus  cible  correspond  à l'identifiant d'utilisateur réel de
       l'appelant et les identifiants de groupe réel  et  effectif  et  le  set-GID  sauvé  du  processus  cible
       correspond à l'identifiant de groupe réel du processus.

VALEUR RENVOYÉE

       Ces  appels système renvoient 0 en cas de succès, ou -1 en cas d'échec, auquel cas errno contient le code
       d'erreur.

ERREURS

       EFAULT L'un des arguments pointe en‐dehors de l'espace d'adressage accessible.

       EINVAL La valeur spécifiée  dans  resource  n'est  pas  valide ;  ou,  pour  setrlimit()   ou  prlimit(),
              rlim->rlim_cur est plus grand que rlim->rlim_max.

       EPERM  Un  processus non privilégié a essayé d'augmenter la limite stricte ; la capacité CAP_SYS_RESOURCE
              est nécessaire pour pouvoir faire cela. Ou le processus a essayé  d'augmenter  la  limite  stricte
              RLIMIT_NOFILE  au‐dessus  du  maximum  (NR_OPEN)  du  noyau actuel. Ou alors le processus appelant
              n'avait pas la permission de changer les limites du processus spécifié par pid.

       ESRCH  Impossible de trouver un processus dont l'identifiant est indiqué par pid.

VERSIONS

       L'appel système prlimit() est disponible depuis Linux 2.6.36 ; la prise  en  charge  dans  la  glibc  est
       disponible depuis la version 2.13.

CONFORMITÉ

       getrlimit(), setrlimit() : SVr4, BSD 4.3, POSIX.1-2001.
       prlimit() : spécifique à Linux.

       RLIMIT_MEMLOCK  et  RLIMIT_NPROC  proviennent  de BSD et ne sont pas définis dans POSIX.1-2001 ; ils sont
       présents dans les BSD et Linux, mais dans peu d'autres implémentations. RLIMIT_RSS vient de BSD et  n'est
       pas   défini  dans  POSIX.1-2001 ;  cependant,  il  est  présent  sur  la  plupart  des  implémentations.
       RLIMIT_MSGQUEUE, RLIMIT_NICE, RLIMIT_RTPRIO, RLIMIT_RTTIME et RLIMIT_SIGPENDING sont spécifiques à Linux.

NOTES

       Un processus fils créé avec fork(2) hérite des limites de ressource de son père. Les limites de ressource
       sont préservées à travers un execve(2).

       Descendre la limite souple d'une ressource en dessous de l'actuelle utilisation par le processus de cette
       ressource fonctionne (mais cela empêchera le processus  d'augmenter  ultérieurement  sa  consommation  de
       cette ressource).

       On peut définir les limites de ressources de l'interpréteur de commandes en utilisant la commande interne
       ulimit (limit dans csh(1)). Les limites de ressources de l'interpréteur de commandes  sont  héritées  par
       les processus qu'il crée pour exécuter les commandes.

       À  partir de Linux 2.6.24, les limites de ressource de n'importe quel processus peuvent être examinées en
       consultant /proc/[pid]/limits ; consultez proc(5).

       Des systèmes anciens fournissent une fonction vlimit() qui remplit le même rôle que setrlimit(). Pour des
       raisons  de  compatibilité  ascendante,  la  glibc  fournit  aussi une fonction vlimit(), mais toutes les
       nouvelles applications devraient utiliser setrlimit().

BOGUES

       Dans les noyaux Linux plus anciens, les signaux SIGXCPU et SIGKILL envoyés lorsqu'un processus  dépassait
       les  limites  souple  et  stricte  pour  RLIMIT_CPU  étaient  envoyés  une seconde (CPU) plus tard qu'ils
       n'auraient dû l'être. Cela a été corrigé dans le noyau 2.6.8.

       Dans les noyaux de la série 2.6 antérieurs à 2.6.17, une limite RLIMIT_CPU à 0 est interprétée par erreur
       comme  « pas  de  limite »  (comme RLIM_INFINITY). Depuis Linux 2.6.17, définir la limite à 0 a un effet,
       mais la limite est en fait d'une seconde.

       En raison d'un bogue du noyau, RLIMIT_RTPRIO ne marche pas dans le  noyau  2.6.12 ;  le  problème  a  été
       corrigé dans le noyau 2.6.13.

       Dans  le  noyau  2.6.12,  il  y  avait  une  différence  de 1 entre les valeurs de priorité renvoyées par
       getpriority(2) et RLIMIT_NICE. Du coup, la limite réelle pour la valeur de politesse était calculée comme
       19 - rlim_cur. Ceci est corrigé depuis le noyau 2.6.13.

       A  partir  de  Linux  2.6.12,  si  un processus atteint sa limite souple RLIMIT_CPU et qu'il dispose d'un
       gestionnaire pour SIGXCPU, alors en plus d'invoquer le gestionnaire  de  signal,  le  noyau  augmente  la
       limite  souple  d'une  seconde.  Ce comportement se répète si le processus continue de consommer du temps
       processeur, jusqu'à ce que la limite stricte soit atteinte, auquel cas le  processus  est  tué.  D'autres
       implémentations  ne modifient pas la limite souple RLIMIT_CPU de cette façon, et le comportement de Linux
       n'est alors probablement pas conforme aux standards ;  pour  cette  raison,  les  applications  portables
       doivent éviter de tabler sur ce comportement. La limite propre à Linux RLIMIT_RTTIME se comporte de façon
       analogue lorsque la limite souple est atteinte.

       Les noyaux antérieurs à 2.4.22 ne détectaient pas l'erreur EINVAL pour setrlimit()  quand  rlim->rlim_cur
       était plus grand que rlim->rlim_max.

EXEMPLE

       Le programme ci-dessous démontre l'utilisation de prlimit().

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

       #define errExit(msg)     do { perror(msg); exit(EXIT_FAILURE); \
                               } while (0)

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

           if (!(argc == 2 || argc == 4)) {
               fprintf(stderr, "Usage: %s <pid> [<nouvelle-limite-souple> "
                       "<nouvelle-limite-stricte>]\n", argv[0]);
               exit(EXIT_FAILURE);
           }

           pid = atoi(argv[1]);        /* PID du processus cible */

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

           /* Définir la limite de temps CPU du processus cible ;
              récupérer et afficher la limite de temps CPU antérieure */

           if (prlimit(pid, RLIMIT_CPU, newp, &old) == -1)
               errExit("prlimit-1");
           printf("Limites précédentes : souple=%lld; stricte=%lld\n",
                   (long long) old.rlim_cur, (long long) old.rlim_max);

           /* Récupérer et afficher la nouvelle limite de temps CPU */

           if (prlimit(pid, RLIMIT_CPU, NULL, &old) == -1)
               errExit("prlimit-2");
           printf("Nouvelles limites: souple=%lld; stricte=%lld\n",
                   (long long) old.rlim_cur, (long long) old.rlim_max);

           exit(EXIT_FAILURE);
       }

VOIR AUSSI

       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), signal(7)

COLOPHON

       Cette page fait partie de la publication 3.65 du projet man-pages Linux. Une description du projet et des
       instructions     pour     signaler     des     anomalies    peuvent    être    trouvées    à    l'adresse
       http://www.kernel.org/doc/man-pages/.

TRADUCTION

       Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a <http://po4a.alioth.debian.org/> par
       l'équipe de traduction francophone au sein du projet perkamon <http://perkamon.alioth.debian.org/>.

       Christophe       Blaess       <http://www.blaess.fr/christophe/>      (1996-2003),      Alain      Portal
       <http://manpagesfr.free.fr/> (2003-2006).  Julien  Cristau  et  l'équipe  francophone  de  traduction  de
       Debian (2006-2009).

       Veuillez  signaler  toute erreur de traduction en écrivant à <debian-l10n-french@lists.debian.org> ou par
       un rapport de bogue sur le paquet manpages-fr.

       Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « man -L C
       <section> <page_de_man> ».