sem_overview - Panorama des sémaphores POSIX
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.
Before Linux 2.6, Linux supported only unnamed, thread-shared semaphores. On a
system with Linux 2.6 and a glibc that provides the NPTL threading
implementation, a complete implementation of POSIX semaphores is provided.
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.
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.
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.
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).
Un exemple d'utilisation des diverses fonctions des sémaphores POSIX est
donné dans
sem_wait(3).
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)
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]> et David Prévot <
[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]