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() 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 (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.44 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> ».