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. 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
(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 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).
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 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.65 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¶
Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a
<
http://po4a.alioth.debian.org/> par l'équipe de traduction
francophone au sein du projet perkamon
<
http://perkamon.alioth.debian.org/>.
Christophe Blaess <
http://www.blaess.fr/christophe/> (1996-2003), Alain
Portal <
http://manpagesfr.free.fr/> (2003-2006). Julien Cristau et
l'équipe francophone de traduction de Debian (2006-2009).
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> ».