get_robust_list, set_robust_list - Lire et écrire une liste de futex
robustes
Bibliothèque C standard (
libc,
-lc)
#include <linux/futex.h> /* Définition de struct robust_list_head */
#include <sys/syscall.h> /* Définition des constantes SYS_* */
#include <unistd.h>
long syscall(SYS_get_robust_list, int pid,
struct robust_list_head **head_ptr, size_t *len_ptr);
long syscall(SYS_set_robust_list,
struct robust_list_head *head, size_t len);
Note : la glibc ne fournit pas de fonction autour de cet appel
système, l'utilisation de
syscall(2) est requise.
Ces appels système gèrent la liste des futex robustes par thread.
Ces listes sont gérées dans l'espace utilisateur : le
noyau ne connaît que l'emplacement de la tête de liste. Un
thread peut informer le noyau de l'emplacement de sa liste de futex robustes
en utilisant
set_robust_list(). L'adresse d'une liste de futex robustes
de thread peut s'obtenir en utilisant
get_robust_list().
Le but d'une liste de futex robustes est de s'assurer que si un thread ne
parvient pas, par accident, à déverrouiller un futex avant qu'il
ne se termine ou à appeller
execve(2), un autre thread qui
attend ce futex soit notifié que l'ancien propriétaire du futex
est mort. Cette notification se compose de deux parties : le bit
FUTEX_OWNER_DIED bit est défini dans le mot futex, et le noyau
réalise une opération
FUTEX_WAKE de
futex(2) sur
un des threads attendant sur le futex.
L'appel système
get_robust_list() renvoie la tête de la
liste de futex robustes du thread dont l'identifiant de thread est
indiqué par
pid. Si
pid est
0, la tête de
liste pour le thread appelant est renvoyée. La tête de liste est
conservée à l'emplacement pointé par
head_ptr. La
taille de l'objet pointé par
**head_ptr est conservée
dans
len_ptr.
Le droit d'utiliser
get_robust_list() est soumis à une
vérification par
PTRACE_MODE_READ_REALCREDS du mode
d'accès ptrace ; voir
ptrace(2).
L'appel système
set_robust_list() demande au noyau d'enregistrer
la tête de la liste de futex robustes appartenant au thread appelant.
L'argument
head est la tête de liste à enregistrer.
L'argument
len devrait être
sizeof(*head).
Les appels systèmes
set_robust_list() et
get_robust_list()
renvoient zéro quand l'opération a réussi, et un code
d'erreur sinon.
L'appel système
set_robust_list() peut échouer avec
l'erreur suivante :
- EINVAL
-
len n'est pas égal à
sizeof(struct robust_list_head).
L'appel système
get_robust_list() peut échouer avec les
erreurs suivantes :
- EFAULT
- La tête de la liste de futex robustes ne peut pas
être conservée à l'emplacement head.
- EPERM
- Le processus appelant n'a pas le droit de voir la liste de
futex robustes du thread avec l'identifiant de thread pid, et n'a
pas la capacité CAP_SYS_PTRACE.
- ESRCH
- Aucun thread avec pour identifiant de thread pid n'a
pu être trouvé.
Ces appels ont été ajoutés dans Linux 2.6.17.
Ces appels système ne sont pas nécessaires pour des applications
nromales.
Un thread ne peut avoir qu'une seule liste de futex robustes. Par
conséquent, les applications qui désirent utiliser cette
fonctionnalité devraient utiliser les mutex robustes fournis par la
glibc.
Dans l'implémentation initiale, un thread en attente d'un futex
n'était prévenu que le propriétaire était mort que
si ce dernier se terminait. À partir de Linux 2.6.28, la notification a
été étendue pour inclure le cas où le
propriétaire effectue un
execve(2).
Les ID du thread indiqués dans le corps du texte sont des ID de thread du
kernel du même type que ceux renvoyés par
clone(2)
et
gettid(2).
futex(2),
pthread_mutexattr_setrobust(3)
Documentation/robust-futexes.txt et
Documentation/robust-futex-ABI.txt dans l'arborescence des sources du
noyau Linux
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]> 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]