NOM
semget - Obtenir l’identifiant d’un ensemble de sémaphores.
SYNOPSIS
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
int semget(key_t key, int nsems, int semflg);
L’appel système semget() renvoie l’identifiant de l’ensemble de
sémaphores associé à la valeur de clé key. 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. (Ceci est analogue à l’effet de la combinaison O_CREAT | O_EXCL
pour open(2).)
Pendant la création, les 9 bits de poids faibles 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.
Les valeurs des sémaphores dans un ensemble qui vient d’être créé sont
indéterminées (POSIX.1-2001 est explicite sur ce point). 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.
Durant la création, la structure de données semid_ds (voir 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 faibles de sem_perm.mode contiennent les 9
bits de poids faibles 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 RENVOYÉE
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’erreur, 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.
EEXIST Le jeu de sémaphore associé a key existe mais l’argument semflg
précise à la fois IPC_CREAT et IPC_EXCL.
EINVAL nsems est inférieur à zéro ou supérieur à la limite sur le
nombre de sémaphores par ensemble, (SEMMSL), ou l’ensemble de
sémaphores identifié par key existe déjà, et nsems est plus
grand que le nombre de sémaphores par ensemble.
ENOENT Aucun jeu de sémaphore 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
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 faibles de semflg et tentera de
créer un nouveau jeu de sémaphores.
Les limites suivantes concernent l’appel système semget() :
SEMMNI Nombre maximal de jeux de sémaphores sur le système : dépend de
la politique (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 : dépendant de
l’implémentation (sous Linux, cette limite peut être lue et
modifiée dans le premier champ de /proc/sys/kernel/sem).
SEMMNS Nombre maximal de sémaphores sur le système : dépend de la
politique (sous Linux, cette limite peut être lue et modifiée
dans le second champ de /proc/sys/kernel/sem). Les valeurs
supérieures à SEMMSL * SEMMNI sont incorrectes.
BOGUES
Le choix du nom IPC_PRIVATE est malheureux, IPC_NEW aurait mieux décrit
sa fonction.
Les sémaphores dans un ensemble ne sont pas initialisés par semget().
Pour initialiser les sémaphores, il faut utiliser semctl(2) pour
effectuer une opération SETVAL ou SETALL sur l’ensemble de sémaphores.
(Lorsque plusieurs pairs ne savent pas lequel initialisera l’ensemble
en premier, un test pour une valeur non nulle de sem_otime dans la
structure de données associée renvoyée par l’opération IPC_STAT de
semctl(2) peut être utilisée pour éviter les problèmes d’accès
concurrents.)
VOIR AUSSI
semctl(2), semop(2), ftok(3), capabilities(7), sem_overview(7),
svipc(7)
COLOPHON
Cette page fait partie de la publication 3.23 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
Cette page de manuel a été traduite et mise à jour par Christophe
Blaess <http://www.blaess.fr/christophe/> entre 1996 et 2003, puis par
Alain Portal <aportal AT univ-montp2 DOT fr> jusqu’en 2006, et mise à
disposition sur http://manpagesfr.free.fr/.
Les mises à jour et corrections de la version présente dans Debian sont
directement gérées par Julien Cristau <jcristau@debian.org> et l’équipe
francophone de traduction de Debian.
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> ».