GETRLIMIT
Section: Manuel du programmeur Linux (2) Updated: 18 juillet 2003 Index
NOM
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
CONFORMITÉ
NOTE
VOIR AUSSI
TRADUCTION
NOM
getrlimit, getrusage, setrlimit - Lire/écrire les limites et utilisations des ressources.
SYNOPSIS
#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);
DESCRIPTION
getrlimit
et
setrlimit
lisent ou écrivent les limites des ressources systèmes. 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é 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().
resource
doit être l'un des éléments suivants :
- 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 en est la terminaison du processus.
Mais le signal peut être capturé et le gestionnaire
peut renvoyer le contrôle au programme
principal.
Si le processus continue à consommer du temps CPU, il recevra
SIGXCPU
toutes les secondes jusqu'à atteindre sa limite stricte,
où il recevra
SIGKILL.
(Ceci correspond au comportement de Linux 2.2 et 2.4.
Les implémentations varient sur le comportement vis-à-vis d'un processus
qui continue à consommer du temps CPU après dépassement de sa limite souple.
Les applications portables qui doivent capturer ce signal devrait
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() et sbrk(),
qui échouent avec l'erreur
ENOMEM
si la limite souple est dépassée.
- RLIMIT_FSIZE
-
Taille maximal d'un fichier que le processus peut créer.
Les tentatives d'extension d'un fichier au-delà de cette limite resultent 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(), truncate())
échouent avec l'erreur
EFBIG.
RLIMIT_LOCKS
Une limite sur le nombre combiné de verrous
flock()
et
fcntl()
que le processus peut établir
(Linux 2.4 et suivants).
- RLIMIT_MEMLOCK
-
Le nombre maximal d'octets de mémoire virtuelle que le processus peut
verrouiller en RAM à l'aide des appels
lock() et mlockall().
- RLIMIT_NOFILE
-
Le nombre maximal de descripteurs de fichiers qu'un processus
peut ouovrir simultanément.
Les tentatives d'ouverture
(open(), pipe(), dup(), etc)
dépassant cette limite renverront l'erreur
EMFILE.
- RLIMIT_NPROC
-
Le nombre maximum de processus qui peuvent être créés pour l'UID réel
du processus appelant.
Une fois cette limite atteinte,
fork()
é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 page de mémoire virtuelle en RAM).
Cette limite n'a d'effet que depuis Linux 2.4, et n'affecte
que les appels
madvise()
indiquant
MADVISE_WILLNEED.
- RLIMIT_STACK
-
La taille maximal 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)).
RLIMIT_OFILE
est le nom BSD pour
RLIMIT_NOFILE.
getrusage
renvoie l'utilisation courante des ressources, pour who
valant à
RUSAGE_SELF
ou
RUSAGE_CHILDREN.
Le premier correspond aux ressources consommées par le processus appelant
et le second par l'ensemble des processus fils terminés qui ont été attendus
par un wait().
struct rusage {
struct timeval ru_utime; /* Temps utilisateur écoulé */
struct timeval ru_stime; /* Temps système écoulé */
long ru_maxrss; /* Taille résidente maximale */
long ru_ixrss; /* Taille de mémoire partagée */
long ru_idrss; /* Taille des données non partagées */
long ru_isrss; /* Taille de pile */
long ru_minflt; /* Demandes de pages */
long ru_majflt; /* Nombre de fautes de pages */
long ru_nswap; /* Nombre de swaps */
long ru_inblock; /* Nombre de lectures de blocs */
long ru_oublock; /* Nombre d'écritures de blocs */
long ru_msgsnd; /* Nombre de messages émis */
long ru_msgrcv; /* Nombre de messages reçus */
long ru_nsignals; /* Nombre de signaux reçus */
long ru_nvcsw; /* Chgmnts de contexte volontaires */
long ru_nivcsw; /* Chgmnts de contexte involontaires*/
};
VALEUR RENVOYÉE
Ces fonctions renvoient 0 si elles réussissent, ou -1 si elles échouent, auquel cas
errno
contient le code d'erreur.
ERREURS
- EFAULT
-
rlim
ou
usage
pointent en dehors de l'espace d'adressage disponible.
- EINVAL
-
getrlimit ou setrlimit
est appelé avec un mauvais argument resource,
ou getrusage est appelé avec un mauvais argument who.
- EPERM
-
Tentative d'utiliser setrlimit() sans être Super-User pour
augmenter ses limites, ou alors le Super-User essaye d'augmenter
les limites au-dessus des maxima du noyau.
CONFORMITÉ
SVr4, BSD 4.3
NOTE
L'inclusion de
<sys/time.h>
n'est plus obligatoire mais améliore la portabilité.
(En fait,
struct timeval
est définie dans
<sys/time.h>).
Sous Linux, si le traitement de
SIGCHLD
est configuré avec
SIG_IGN
alors les statistiques d'utilisation des processus enfants
sont automatiquement incluses dans les valeurs renvoyées par
RUSAGE_CHILDREN,
bien que POSIX 1003.1-2001 interdise explicitement cela.
Les structures ci-dessous sont extraites de BSD 4.3 Reno.
Tous les champs ne sont pas significatifs sous Linux. Actuellement
(Linux 2.4) seuls les champs
ru_utime,
ru_stime,
ru_minflt,
ru_majflt,
et
ru_nswap
sont remplis.
VOIR AUSSI
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)
TRADUCTION
Christophe Blaess, 1996-2003.
|