Provided by:
manpages-fr-dev_3.27fr1.4-1_all 
NOM
futex - Mecanisme de verrouillage rapide en mode utilisateur
SYNOPSIS
#include <linux/futex.h>
#include <sys/time.h>
int futex(int *uaddr, int op, int val, const struct timespec *timeout,
int *uaddr2, int val3);
DESCRIPTION
L'appel systeme futex() donne a un programme la possibilite d'attendre
qu'une valeur a une adresse donnee change, ou de reveiller tous ceux
qui sont en attente sur cette adresse. Bien que les adresses soient
differentes dans des processus separes, le noyau fera la correspondance
lors de l'appel systeme. Cet appel systeme est typiquement employe pour
implementer les verrous en memoire partagee, tels qu'ils sont decrits
dans futex(7).
Quand une operation futex(7) ne se termine pas de maniere satisfaisante
dans l'espace utilisateur, un appel au noyau est necessaire pour
l'arbitrage. Ceci signifie soit endormir le processus appelant, soit
reveiller le processus en attente.
Les appelants de cette fonction doivent accepter les semantiques
decrites dans futex(7). Comme celles-ci impliquent l'ecriture
d'instructions non portables en assembleur, leurs utilisateurs sont des
auteurs de bibliotheques plus que des developpeurs applicatifs.
Le parametre uaddr doit pointer sur un entier aligne qui stocke le
compteur. L'operation a executer est transmise dans le parametre op,
avec la valeur val.
Cinq operations sont definies pour le moment :
FUTEX_WAIT
Cette operation verifie que l'adresse du futex uaddr contient
toujours la valeur val indiquee et s'endort en attendant un
FUTEX_WAKE a cette adresse. Les deux etapes sont liees
atomiquement. Si l'argument timeout est non nul, il contient la
duree maximale de sommeil. Sinon, elle est infinie. Les
arguments uaddr2 et val3 sont ignores.
D'apres futex(7), cet appel est execute si la decrementation du
compteur donne une valeur negative (indiquant un conflit) et le
sommeil durera jusqu'a ce qu'un autre processus relache le futex
et execute FUTEX_WAKE.
FUTEX_WAKE
Cette operation reveille au plus val processus en attente sur
l'adresse du futex (endormis dans FUTEX_WAIT). Les arguments
timeout, uaddr2 et val3 sont ignores.
D'apres futex(7), ceci est execute si l'incrementation du
compteur montre qu'il y a des processus en attente, une fois que
la valeur du futex a ete mise a 1 (indiquant qu'il est
disponible).
FUTEX_FD (present jusqu'a Linux 2.6.25 inclus)
Pour permettre des reveils asynchrones, cette operation associe
un descripteur de fichier avec un futex. Si un autre processus
execute un FUTEX_WAKE, l'appelant recevra le signal dont le
numero a ete indique dans val. L'appelant doit refermer le
descripteur de fichier apres utilisation. Les arguments timeout,
uaddr2 et val3 sont ignores.
Pour eviter les situations de concurrence, l'appelant doit
tester si le futex a ete libere apres le retour de FUTEX_FD.
Parce qu'il etait de facon inherent sujet a des situations de
concurrence, FUTEX_FD a ete supprime de Linux 2.6.26 et les
suivants.
FUTEX_REQUEUE (depuis Linux 2.5.70)
Cette operation a ete introduite dans le but d'eviter que trop
de processus necessitant un autre futex ne soient actives lors
de l'utilisation de FUTEX_WAKE. Cet appel reactive val
processus, et remet en file d'attente tous les autres qui
attendaient le futex a l'adresse uaddr2. Les arguments timeout
et val3 sont ignores.
FUTEX_CMP_REQUEUE (depuis Linux 2.6.7)
Il y a un probleme de concurrence dans l'utilisation prevue pour
FUTEX_REQUEUE, aussi FUTEX_CMP_REQUEUE a ete introduit. Cette
operation est similaire a FUTEX_REQUEUE, sauf qu'elle verifie si
l'adresse uaddr contient encore la valeur val3. Si non,
l'operation echoue avec l' erreur EAGAIN.L'argument timeout est
ignore.
VALEUR RENVOY'EE
Suivant l'operation executee, la valeur renvoyee en cas de succes peut
avoir differentes significations.
FUTEX_WAIT
Renvoie 0 si le processus a ete reveille par un appel
FUTEX_WAKE. En cas de depassement de delai, l'operation echoue
avec l'erreur ETIMEDOUT. L'operation echoue avec l'erreur
EWOULDBLOCK si le futex n'avait pas la valeur attendue.
L'arrivee d'un signal (consultez signal(7)) ou un autre reveil
intempestif peut causer l'echec d'un FUTEX_WAIT avec l'erreur
EINTR.
FUTEX_WAKE
Renvoie le nombre de processus reveilles.
FUTEX_FD
Renvoie le nouveau descripteur associe au futex.
FUTEX_REQUEUE
Renvoie le nombre de processus reveilles.
FUTEX_CMP_REQUEUE
Renvoie le nombre de processus reveilles.
En cas d'erreur, toutes les operations renvoient -1, et errno contient
le code d'erreur.
ERREURS
EACCES Pas d'acces en lecture a la memoire futex.
EAGAIN FUTEX_CMP_REQUEUE a trouve une valeur inattendue de futex. (Cela
indique probablement une condition de concurrence ; utilisez
maintenant FUTEX_WAKE.)
EFAULT Erreur lors de la recuperation de l'information timeout a partir
de l'espace utilisateur.
EINVAL Une operation n'a pas ete definie ou il y a une erreur
d'alignement de page.
ENFILE La limite du nombre total de fichiers ouverts sur le systeme a
ete atteinte.
ENOSYS op contient une operation non valable.
VERSIONS
Le support initial des futex a ete ajoute dans Linux 2.5.7 mais avec
une semantique differente de celle decrite ci-dessus. Un appel systeme
a 4 parametres avec la semantique decrite dans cette page a ete ajoute
dans Linux 2.5.40. Dans Linux 2.5.70, un parametre supplementaire a ete
ajoute. Un sixieme parametre a ete ajoute dans Linux 2.6.7 --
complique, surtout sur l'architecture s390.
CONFORMIT'E
Cet appel systeme est specifique a Linux.
NOTES
Repetons-le, les futex de base ne sont pas concus comme une abstraction
facile a employer pour les utilisateurs (mais la glibc ne fournit pas
de fonction autour de cet appel systeme). Les implementeurs doivent
maitriser l'assembleur et avoir lu les sources de la bibliotheque en
espace utilisateur decrite ci-dessous.
VOIR AUSSI
futex(7)
<< Fuss, Futexes and Furwocks: Fast Userlevel Locking in Linux >>
(proceedings of the Ottawa Linux Symposium 2002), disponible en ligne a
http://kernel.org/doc/ols/2002/ols2002-pages-479-495.pdf
La bibliotheque d'exemple de futex, futex-*.tar.bz2 a
ftp://ftp.nl.kernel.org/pub/linux/kernel/people/rusty/.
COLOPHON
Cette page fait partie de la publication 3.27 du projet man-pages
Linux. Une description du projet et des instructions pour signaler des
anomalies peuvent etre trouvees a l'adresse
<URL:http://www.kernel.org/doc/man-pages/>.
TRADUCTION
Depuis 2010, cette traduction est maintenue a l'aide de l'outil po4a
<URL:http://po4a.alioth.debian.org/> par l'equipe de traduction
francophone au sein du projet perkamon
<URL:http://perkamon.alioth.debian.org/>.
Christophe Blaess <URL:http://www.blaess.fr/christophe/> (1996-2003),
Alain Portal <URL:http://manpagesfr.free.fr/> (2003-2006). Julien
Cristau et l'equipe francophone de traduction de Debian (2006-2009).
Veuillez signaler toute erreur de traduction en ecrivant a
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir acces a la version anglaise de ce document
en utilisant la commande << man -L C <section> <page_de_man> >>.
Linux 29 aout 2010 FUTEX(2)