#include <linux/futex.h> #include <sys/time.h> int futex(int *uaddr, int op, int val, const struct timespec *timeout,
int *uaddr2, int val3);
L'appel système futex() donne à un programme la possibilité d'attendre qu'une valeur à une adresse donnée change, ou de réveiller tous ceux qui sont en attente sur cette adresse. Bien que les adresses soient différentes dans des processus séparés, le noyau fera la correspondance lors de l'appel système. Ceci est typiquement employé pour implémenter les verrous en mémoire partagée, tels qu'ils sont décrits dans futex(7).
Quand une opération futex(7) ne se termine pas de manière satisfaisante dans l'espace utilisateur, un appel au noyau est nécessaire pour l'arbitrage. Ceci signifie soit endormir le processus appelant, soit réveiller le processus en attente.
Les appelants de cette fonction doivent accepter les sémantiques décrites dans futex(7). Comme celles-ci impliquent l'écriture d'instructions non portables en assembleur, leurs utilisateurs sont des auteurs de bibliothèques plus que des développeurs applicatifs.
L'argument uaddr doit pointer sur un entier aligné qui stocke le compteur. L'opération à exécuter est transmise dans le paramètre op, avec la valeur val.
Cinq opérations sont définies pour le moment :
D'après futex(7), cet appel est exécuté si la décrémentation du compteur donne une valeur négative (indiquant un conflit) et le sommeil durera jusqu'à ce qu'un autre processus relâche le futex et exécute FUTEX_WAKE.
Pour éviter les situations de concurrence, l'appelant doit tester si le futex a été libéré après le retour de FUTEX_FD.
Parce que cette situation de concurrence était héritée, FUTEX_FD a été supprimé dans Linux 2.6.26. les applications qui l'utilisent doivent à présent être corrigées.
Suivant l'opération exécutée, la valeur renvoyée pour un appel réussi peut avoir différentes significations.
En cas d'erreur, toutes les opérations renvoient -1 et renseignent errno en conséquence.
Le support initial des futex a été ajouté dans Linux 2.5.7 mais avec une sémantique différente de celle décrite ci-dessus. Un appel système à 4 paramètres avec la sémantique décrite ici est disponible depuis Linux 2.5.40. Un paramètre supplémentaire a été ajouté dans Linux 2.5.70. Dans Linux 2.6.7, un sixième paramètre a été ajouté --- déguelasse, particulièrement pour l'architecture s390.
Répétons-le, les futex de base ne sont pas conçus comme une abstraction facile à employer pour les utilisateurs. Les implémenteurs doivent maîtriser l'assembleur et avoir lu les sources de la bibliothèque en espace utilisateur décrite plus bas.
« Fuss, Futexes and Furwocks: Fast Userlevel Locking in Linux » (proceedings of the Ottawa Linux Symposium 2002), bibliothèque d'exemple de futex futex-*.tar.bz2 <URL:ftp://ftp.nl.kernel.org/pub/linux/kernel/people/rusty/>.
Ce document est une traduction réalisée par Christophe Blaess <http://www.blaess.fr/christophe/> le 18 juillet 2003 et révisée le 17 juillet 2008.
L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 2 futex ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.
Dernière mise à jour : 17 juillet 2008