semget(2) 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).

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 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.)

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 à <[email protected]> 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> ».