sem_overview
Table des matières
Retour à l'index
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 une 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 Linux 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.
Liaison
Les programmes utilisant l'API des sémaphores POSIX doivent être compilés
avec cc -pthread pour être liés 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.
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).
EXEMPLES
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), shm_overview(7)
TRADUCTION
La traduction française de cette page de manuel a été créée par
Christophe Blaess <https://www.blaess.fr/christophe/>,
Stéphan Rafin <stephan.rafin@laposte.net>,
Thierry Vignaud <tvignaud@mandriva.com>,
François Micaux,
Alain Portal <aportal@univ-montp2.fr>,
Jean-Philippe Guérard <fevrier@tigreraye.org>,
Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>,
Julien Cristau <jcristau@debian.org>,
Thomas Huriaux <thomas.huriaux@gmail.com>,
Nicolas François <nicolas.francois@centraliens.net>,
Florentin Duneau <fduneau@gmail.com>,
Simon Paillard <simon.paillard@resel.enst-bretagne.fr>,
Denis Barbier <barbier@debian.org>
et
David Prévot <david@tilapin.org>
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 à
Index
- NOM
-
- DESCRIPTION
-
- Versions
-
- Persistance
-
- Liaison
-
- Accéder aux sémaphores nommés par le système de fichiers
-
- NOTES
-
- EXEMPLES
-
- VOIR AUSSI
-
- TRADUCTION
-
This document was created by
man2html,
using the manual pages.
Time: 05:06:38 GMT, September 19, 2025