NOM¶
sem_overview - Panorama des sémaphores POSIX
DESCRIPTION¶
Les sémaphores POSIX permettent aux processus et aux threads de se
synchroniser.
Un sémaphore est un entier dont la valeur ne peut jamais être
négative. Deux opérations peuvent être effectuées :
incrémenter la valeur du sémaphore de 1 (
sem_post(3)), ou
décrémenter la valeur du sémaphore de 1 (
sem_wait(3)).
Si la valeur courante est 0, une opération
sem_wait(3) bloque
jusqu'à ce que la valeur devienne strictement positive.
Les sémaphores POSIX sont de deux types : les sémaphores
nommés et les sémaphores anonymes.
- Sémaphores nommés
- Un sémaphore nommé est identifié par un nom
de la forme /un_nom ; c'est-à-dire un chaîne
terminée par un caractère nul pouvant avoir jusqu'à
NAME_MAX -4 (251) caractères, commençant
par une barre oblique (« / ») suivie d'un
caractère ou plus, aucun de ces derniers n'étant une barre
oblique. Deux processus peuvent utiliser un même sémaphore
nommé en passant le même nom à sem_open(3).
La fonction sem_open(3) crée un nouveau sémaphore
nommé ou en ouvre un existant. Après l'ouverture de ce
sémaphore, il peut être utilisé avec sem_post(3) et
sem_wait(3). Lorsqu'un processus a fini d'utiliser le
sémaphore, il peut utiliser sem_close(3) pour le fermer.
Lorsque tous les processus ont terminé de l'utiliser, il peut
être supprimé du système avec sem_unlink(3).
- Sémaphores anonymes (sémaphores en
mémoire)
- Un sémaphore anonyme n'a pas de nom. Il est placé
dans une région de la mémoire qui est partagée entre
plusieurs threads ( sémaphore partagé par des
threads) ou processus ( sémaphore partagé par des
processus). Un sémaphore partagé par des threads est
placé dans une région de la mémoire partagée entre les
threads d'un processus, par exemple une variable globale. Un
sémaphore partagé par des processus doit être placé
dans une région de mémoire partagée (par exemple un segment
de mémoire partagée System V créé avec
shmget(2), ou un objet de mémoire partagée POSIX
créé avec shm_open(3)).
Avant son utilisation, un sémaphore anonyme doit être
initialisé avec sem_init(3). Il peut ensuite être
utilisé avec sem_post(3) et sem_wait(3). Lorsque le
sémaphore n'est plus nécessaire, et avant que la mémoire
où il est placé ne soit libérée, le sémaphore
doit être détruit avec sem_destroy(3).
Le reste de cette section décrit certains détails spécifiques
à l'implémentation Linux des sémaphores POSIX.
Versions¶
Avant le noyau 2.6, Linux ne proposait que les sémaphores anonymes
partagés par des threads. Sur un système Linux 2.6 avec une
glibc fournissant l'implémentation des threads NPTL, une
implémentation complète des sémaphores POSIX est fournie.
Persistance¶
Les sémaphores POSIX nommés sont persistants dans le noyau : s'il
n'est pas supprimé avec
sem_unlink(3) un sémaphore existe
tant que le système n'est pas éteint.
Édition des liens¶
Les programmes utilisant l'API des sémaphores POSIX doit être
compilé avec
cc -pthread pour être lié avec la
bibliothèque temps‐réel,
librt.
Accéder aux sémaphores nommés par le système
de fichiers¶
Sous Linux, les sémaphores nommés sont créés sur un
système de fichiers virtuel, en général monté sur
/dev/shm, avec des noms de la forme
sem.un_nom (ce qui
explique que les noms des sémaphores soient limités à
NAME_MAX -4 plutôt qu'à
NAME_MAX
caractères).
Depuis Linux 2.6.19, il est possible de placer des listes de contrôle
d'accès sur les fichiers de ce répertoire au niveau groupe et
utilisateur.
POSIX.1-2001.
NOTES¶
Les sémaphores System V (
semget(2),
semop(2), etc.)
sont une API de sémaphores plus vieille. Les sémaphores POSIX
fournissent une interface plus simple et mieux conçue que les
sémaphores System V. En revanche, les sémaphores POSIX sont
moins largement disponibles que les sémaphores System V (surtout sur
les systèmes plus anciens).
EXEMPLE¶
Un exemple d'utilisation des diverses fonctions des sémaphores POSIX est
donné dans
sem_wait(3).
VOIR AUSSI¶
sem_close(3),
sem_destroy(3),
sem_getvalue(3),
sem_init(3),
sem_open(3),
sem_post(3),
sem_unlink(3),
sem_wait(3),
pthreads(7)
COLOPHON¶
Cette page fait partie de la publication 3.44 du projet
man-pages Linux.
Une description du projet et des instructions pour signaler des anomalies
peuvent être trouvées à l'adresse
<
http://www.kernel.org/doc/man-pages/>.
TRADUCTION¶
Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a
<
http://po4a.alioth.debian.org/> par l'équipe de traduction
francophone au sein du projet perkamon
<
http://perkamon.alioth.debian.org/>.
Christophe Blaess <
http://www.blaess.fr/christophe/> (1996-2003), Alain
Portal <
http://manpagesfr.free.fr/> (2003-2006). Julien Cristau et
l'équipe francophone de traduction de Debian (2006-2009).
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet
manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document
en utilisant la commande «
man -L C
<section> <page_de_man> ».