SEMGET
Section : Manuel du programmeur Linux (
2)
Mise à jour de la version anglaise : 27 mai 2004
Index
Menu principal
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);
DESCRIPTION
L'appel système
semget()
retourne 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 si un jeu de sémaphore associé à la clé
key
existe déjà,
alors
semget()
échouera en renseignant
errno
avec
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 l'argument
mode
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 nouvellement créé sont
indéterminées
(POSIX.1-2001 est explicite sur ce point).
Bien que Linux, comme beaucoup d'autres implémentations, initialise
les valeurs des sémaphores à 0, une application portable
ne peut pas compter sur cette initialisation :
elle doit explicitement initialiser
les sémaphores aux valeurs souhaitées.
Durant la création d'un nouveau jeu de sémaphores,
semget()
initialise la structure de données
semid_ds
associée (voir
semctl(2))
de la manière suivante :
-
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
sont renseignés avec 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 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épend 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 deuxième 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 jeu 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 le jeu de sémaphores.
(Lorsque plusieurs pairs ne savent pas lequel initialisera le jeu en premier,
la vérification d'une valeur non nulle pour
sem_otime
dans la structure de données associée renvoyée par l'opération
IPC_STAT
de
semctl(2)
permettra d'éviter les problèmes d'accès concurrents.
VOIR AUSSI
semctl(2),
semop(2),
ftok(3),
capabilities(7),
sem_overview(7),
svipc(7)
TRADUCTION
Ce document est une traduction réalisée par Christophe Blaess
<http://www.blaess.fr/christophe/> le 15 octobre 1996
et révisée le 23 juin 2008.
L'équipe de traduction a fait le maximum pour réaliser une adaptation
française de qualité. La version anglaise la plus à jour de ce document est
toujours consultable via la commande : « LANG=C man 2 semget ».
N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute
erreur dans cette page de manuel.
Index
- NOM
-
- SYNOPSIS
-
- DESCRIPTION
-
- VALEUR RENVOYÉE
-
- ERREURS
-
- CONFORMITÉ
-
- NOTES
-
- BOGUES
-
- VOIR AUSSI
-
- TRADUCTION
-
Dernière mise à jour : 23 juin 2008