NOM
semget - Obtenir l’identifiant d’un ensemble de sémaphores System V
SYNOPSIS
#include
<sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semget(key_t key, int nsems, int semflg);
DESCRIPTION
L’appel système semget() renvoie l’identifiant de l’ensemble de sémaphores System V associé à la valeur de clé key. Cela peut servir pour obtenir l’identifiant d’un ensemble de sémaphores créé précédemment (lorsque semflg vaut 0 et que key n’a pas la valeur IPC_PRIVATE) ou pour créer un nouvel ensemble.
Un nouvel ensemble contenant nsems sémaphores est créé si key a la valeur IPC_PRIVATE ou si aucun ensemble n’est associé à key, et si l’option IPC_CREAT est présente dans semflg.
Si semflg contient à la fois IPC_CREAT et IPC_EXCL et qu’un ensemble de sémaphores existe déjà pour la clé key, semget() échoue et errno vaut EEXIST. (Cela est analogue à l’effet de la combinaison O_CREAT | O_EXCL pour open(2).)
Pendant la création, les 9 bits de poids faible de l’argument semflg définissent les permissions d’accès (pour le propriétaire, le groupe et les autres) au jeu de sémaphores, en utilisant le même format et la même signification que les droits d’accès dans open(2). Les permissions d’exécution ne sont pas utilisées par le système, et pour un jeu de sémaphores, l’autorisation d’écriture signifie autorisation de modification.
Durant la création, la structure de données semid_ds (consultez semctl(2)) contrôlant le jeu de sémaphores est initialisée ainsi par semget() :
sem_perm.cuid et sem_perm.uid contiennent l’UID effectif du processus appelant.
sem_perm.cgid et sem_perm.gid contiennent le GID effectif du processus appelant.
Les 9 bits de poids faible de sem_perm.mode contiennent les 9 bits de poids faible de semflg.
sem_nsems reçoit la valeur nsems.
sem_otime est mis à 0.
sem_ctime est rempli avec l’heure actuelle.
L’argument nsems peut valoir 0 (ignore) si l’appel système n’est pas une création d’ensemble de sémaphores. Autrement nsems doit être supérieur à 0 et inférieur ou égal au nombre maximal de sémaphores par ensemble (SEMMSL).
Si le jeu de sémaphores existe déjà, les permissions d’accès sont contrôlées.
VALEUR DE RETOUR
Si l’appel réussit, il renvoie l’identifiant de l’ensemble (un entier positif), sinon il renvoie -1 et errno contient le code d’erreur.
ERREURS
En cas d’échec, errno prend l’une des valeurs suivantes :
EACCES |
Le jeu de sémaphore associé à key existe, mais le processus n’a aucun droit d’accès sur lui et n’a pas la capacité CAP_IPC_OWNER dans l’espace de noms utilisateur qui régit son espace de noms IPC. | ||
EEXIST |
IPC_CREAT et IPC_EXCL ont été tous les deux indiqués dans semflag, mais un ensemble de sémaphores de clé key existe déjà. | ||
EINVAL |
nsems est inférieur à zéro ou supérieur à la limite du nombre de sémaphores par ensemble, (SEMMSL). | ||
EINVAL |
Un ensemble de sémaphores identifié par key existe déjà, mais nsems est plus grand que le nombre de sémaphores par ensemble. | ||
ENOENT |
Aucun jeu de sémaphores associé a key n’existe et l’argument semflg ne précise pas IPC_CREAT. | ||
ENOMEM |
Pas assez de mémoire pour créer les structures nécessaires. | ||
ENOSPC |
Le nombre maximal de jeux de sémaphores sur le système (SEMMNI) est atteint, ou le nombre maximal de sémaphores sur le système est atteint (SEMMNS). |
CONFORMITÉ
SVr4, POSIX.1-2001.
NOTES
L’inclusion de <sys/types.h> et <sys/ipc.h> n’est pas nécessaire sous Linux et n’est exigée par aucune version de POSIX. Cependant, certaines implémentations anciennes nécessitent l’inclusion de ces fichiers d’en-tête, et le SVID documente aussi leur inclusion. Les applications ayant pour but d’être portables pourraient inclure ces fichiers d’en-tête.
IPC_PRIVATE n’est pas une option, mais un objet de type key_t. Si l’on utilise cette valeur spéciale dans l’argument key, l’appel système ne se préoccupera que des 9 bits de poids faible de semflg et tentera de créer un nouveau jeu de sémaphores.
Initialisation
des sémaphores
Les valeurs des sémaphores dans un ensemble qui vient
d’être créé sont
indéterminées (POSIX.1-2001 et POSIX.1-2008
sont explicites sur ce point, bien que POSIX.1-2008 note que
de futures versions du standard pourraient exiger des
implémentations qu’elles initialisent les
sémaphores à 0). Même si Linux,
comme de nombreuses autres implémentations,
initialise les valeurs des sémaphores
à 0, une application portable ne peut pas
compter sur cette initialisation : elle doit
initialiser explicitement les sémaphores à la
valeur souhaitée.
L’initialisation peut être effectuée avec les opérations SETVAL ou SETALL de la fonction semctl(2). Lorsque plusieurs concurrents ne savent pas qui sera le premier à initialiser le jeu de sémaphores, il est possible de vérifier que le membre sem_otime de la structure récupérée par l’opération semctl(2) IPC_STAT est non nul pour éviter les conditions de concurrence.
Limites des
sémaphores
Les limites suivantes de ressources concernent l’appel
système semget() :
SEMMNI |
Limite système du nombre de jeux de sémaphores. Sur les systèmes Linux antérieurs à la version 3.19, la valeur par défaut pour cette limite était de 128. Depuis Linux 3.19, elle est de 32 000. Sous Linux, cette limite peut être lue et modifiée dans le quatrième champ de /proc/sys/kernel/sem. | ||
SEMMSL |
Nombre maximal de sémaphores par ensemble. Sur les systèmes Linux antérieurs à la version 3.19, la valeur par défaut pour cette limite était de 250. Depuis Linux 3.19, elle est de 32 000. Sous Linux, cette limite peut être lue et modifiée dans le premier champ de /proc/sys/kernel/sem. | ||
SEMMNS |
Limite système du nombre de sémaphores : dépend de la politique (sous Linux, cette limite peut être lue et modifiée dans le second champ de /proc/sys/kernel/sem). Le nombre de sémaphores est également limité par le produit de SEMMSL avec SEMMNI. |
BOGUES
Le choix du nom IPC_PRIVATE est malheureux, IPC_NEW aurait mieux décrit sa fonction.
VOIR AUSSI
semctl(2), semop(2), ftok(3), capabilities(7), sem_overview(7), sysvipc(7)
COLOPHON
Cette page fait partie de la publication 5.05 du projet man-pages Linux. Une description du projet et des instructions pour signaler des anomalies peuvent être trouvées à l’adresse https://www.kernel.org/doc/man-pages/.
TRADUCTION
La traduction française de cette page de manuel a été créée par Christophe Blaess <http://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin [AT] laposte.net>, Thierry Vignaud <tvignaud [AT] mandriva.com>, François Micaux, Alain Portal <aportal [AT] univ-montp2.fr>, Jean-Philippe Guérard <fevrier [AT] tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon [AT] wanadoo.fr>, Julien Cristau <jcristau [AT] debian.org>, Thomas Huriaux <thomas.huriaux [AT] gmail.com>, Nicolas François <nicolas.francois [AT] centraliens.net>, Florentin Duneau <fduneau [AT] gmail.com>, Simon Paillard <simon.paillard [AT] resel.fr>, Denis Barbier <barbier [AT] debian.org> et David Prévot <david [AT] 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 à <debian-l10n-french [AT] lists.org>.