getpriority, setpriority - Lire et écrire la priorité
d'ordonnancement du processus
Bibliothèque C standard (
libc,
-lc)
#include <sys/resource.h>
int getpriority(int which, id_t who);
int setpriority(int which, id_t who, int prio);
La priorité d'ordonnancement du processus, du groupe de processus ou de
l'utilisateur, comme précisé dans
which et
who est
lue avec l'appel
getpriority() et définie avec l'appel
setpriority(). L'attribut du processus concerné par ces appels
système est le même que celui géré par
nice(2) (appelé aussi la valeur « de
politesse »).
La valeur de
which doit être
PRIO_PROCESS,
PRIO_PGRP
ou
PRIO_USER, et
who est interprété en fonction de
which (un ID de processus pour
PRIO_PROCESS, un ID de groupe de
processus pour
PRIO_PGRP et un ID d'utilisateur pour
PRIO_USER).
Une valeur nulle pour
who indique (respectivement) le processus
appelant, le groupe de processus du processus appelant ou l'UID réel du
processus appelant.
Le paramètre
prio est une valeur sur l'intervalle
-20
à
19 (mais voir les NOTES ci-dessous), où
-20 est
la priorité la plus élevée et
19 celle la plus
basse. Les valeurs pour définir une priorité en dehors de cet
intervalle sont silencieusement ramenées dans l'intervalle. La
priorité par défaut est
0 ; les valeurs les plus
basses donnent au processus une priorité d'ordonnancement plus
élevée.
La fonction
getpriority() renvoie la plus haute priorité (la plus
basse valeur numérique) dont bénéficie l'un des processus
indiqué. La fonction
setpriority() positionne la priorité
des processus indiqués à la valeur fournie.
Traditionnellement, seul un processus privilégié pouvait diminuer
la valeur de courtoisie (c'est-à-dire augmenter la priorité).
Mais depuis Linux 2.6.12, un processus non privilégié
peut diminuer la valeur de courtoisie d'un processus cible ayant une limite
souple
RLIMIT_NICE convenable ; voir
getrlimit(2) pour
des détails.
S'il réussit,
setpriority() renvoie la valeur de courtoisie du
thread appelant, qui peut être un nombre négatif. En cas
d'erreur, il renvoie
-1 et positionne
errno pour indiquer
l'erreur.
Puisqu'un appel à
getpriority() peut tout à fait renvoyer
la valeur
-1, il faut effacer
errno avant l'appel afin de
vérifier si
-1 indique une erreur ou une priorité
légitime.
S'il réussit,
setpriority() renvoie
0. En cas d'erreur, il
renvoie
-1 et positionne
errno pour indiquer l'erreur.
- EACCES
- L'appelant a tenté de définir une valeur de
politesse plus basse (c'est-à-dire une priorité de processus
plus élevée) mais il n'a pas les droits requis (sur
Linux : il n'a pas la capacité CAP_SYS_NICE).
- EINVAL
-
which n'était ni PRIO_PROCESS, ni
PRIO_PGRP, ni PRIO_USER.
- EPERM
- Un processus correspond bien aux valeurs indiquées,
mais ni l'UID réel, ni l'UID effectif de l'appelant ne
correspondent à l'UID effectif de ce processus, et (sur les
systèmes Linux l'appelant n'a pas la capacité
CAP_SYS_NICE). Voir les NOTES ci‐dessous.
- ESRCH
- Aucun processus ne correspond aux valeurs de which
et who indiquées.
POSIX.1-2001, POSIX.1-2008, SVr4, 4.4BSD (ces interfaces sont apparues pour la
première fois dans 4.2BSD).
Pour plus de détails sur la valeur de courtoisie, voir
sched(7).
Remarque : l'ajout de la fonctionnalité
« autogroup » à Linux 2.6.38
signifie que la valeur de courtoisie n'a plus son effet traditionnel dans de
nombreuses circonstances. Pour des détails, voir
sched(7).
Un enfant créé avec
fork(2) hérite de la valeur de
politesse de son parent. La valeur de politesse est préservée au
travers d'un
execve(2).
Les détails concernant la condition d'erreur
EPERM
dépendent du système. La description ci‐dessus concerne
ce que dit POSIX.1-2001, et qui semble être suivi par tous les
systèmes de type System V. Les noyaux Linux avant
Linux 2.6.12 demandent que l'UID réel ou effectif de l'appelant
correspondent à l'UID réel du processus
who (et non pas
à son UID effectif). Linux 2.6.12 et suivants demandent que l'UID
effectif de l'appelant corresponde à l'UID réel ou effectif du
processus
who. Tous les systèmes de type BSD
(SunOS 4.1.3, Ultrix 4.2, BSD 4.3, FreeBSD 4.3,
OpenBSD-2.5, ...) se comportent de la même manière que Linux
2.6.12 et les suivants.
L'appel système getpriority renvoie les valeurs de courtoisie traduites
dans l'intervalle 40..1, puisqu'une valeur négative renvoyée
serait interprétée comme une erreur. La fonction enveloppe de la
glibc autour de
getpriority() traduit la valeur en sens inverse, selon
la formule
unice = 20 - knice (ainsi,
l'intervalle 40..1 renvoyé par le noyau correspond à celui
-20..19 vu depuis l'espace utilisateur).
Selon la norme POSIX, la valeur de politesse est définie à
l'échelle du processus. Cependant, les threads POSIX sont actuellement
implémentés dans Linux/NPTL de telle sorte que la valeur de
politesse est un attribut du thread : différents threads d'un
même processus peuvent avoir des valeurs de politesse
différentes. Les applications portables doivent donc éviter de
s'appuyer sur cette propriété de Linux, qui devrait, à
l'avenir, être mise en conformité avec les normes.
nice(1),
renice(1),
fork(2),
capabilities(7),
sched(7)
Documentation/scheduler/sched-nice-design.txt dans les sources du noyau
(depuis Linux 2.6.23)
La traduction française de cette page de manuel a été
créée par Christophe Blaess
<
https://www.blaess.fr/christophe/>, Stéphan Rafin
<
[email protected]>, Thierry Vignaud
<
[email protected]>, François Micaux, Alain Portal
<
[email protected]>, Jean-Philippe Guérard
<
[email protected]>, Jean-Luc Coulon (f5ibh)
<
[email protected]>, Julien Cristau
<
[email protected]>, Thomas Huriaux <
[email protected]>,
Nicolas François <
[email protected]>, Florentin
Duneau <
[email protected]>, Simon Paillard
<
[email protected]>, Denis Barbier
<
[email protected]>, David Prévot <
[email protected]>,
Cédric Boutillier <
[email protected]>,
Frédéric Hantrais <
[email protected]> et Jean-Philippe
MENGUAL <
[email protected]>
Cette traduction est une documentation libre ; veuillez vous reporter
à la
GNU
General Public License version 3 concernant les conditions de copie
et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel,
veuillez envoyer un message à
[email protected]