man semget (Appels systèmes) - Obtenir l'identificateur d'un ensemble de sémaphores.

NOM

semget - Obtenir l'identificateur 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

Cette fonction retourne l'identificateur 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. (i.e. semflg & IPC_CREAT différent de zéro).

La présence de IPC_CREAT et IPC_EXCL dans le champ semflg joue le même rôle, par rapport à l'existence du jeu de sémaphores, que la présence de O_CREAT et O_EXCL dans l'argument de mode de l'appel système open(2) i.e. la fonction semget échouera si semflg demande à la fois IPC_CREAT et IPC_EXCL et si un sémaphore associé a key existe déjà.

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) ou creat(2). Les permissions d'exécutions ne sont pas utilisées par le système, et pour un jeu de sémaphores, l'autorisation d'écriture signifie autorisation de modification.

Durant la création, la structure de données semid_ds contrôlant le jeu de sémaphores est initialisée ainsi :

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.
le 9 bits de poids faibles de sem_perm.mode sont remplis avec les 9 bits de poids faibles de semflg.
sem_nsems reçoit la valeur nsems.
sem_otime est mis a 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, et l'on vérifie si l'ensemble est sur le point d'être détruit.

VALEUR RENVOYÉE

Si l'appel réussit, il renvoie l'identificateur de l'ensemble (un entier positif), sinon il renvoie -1 et errno contient le code d'erreur.

ERREURS

Eaccès
Le jeu de sémaphore associé à key existe, mais le processus n'a aucun droit d'accès sur lui
EEXIST
Le jeu de sémaphore associé a key existe mais l'argument semflg précise à la fois IPC_CREAT et IPC_EXCL.
ENOENT
Aucun jeu de sémaphore associé a key n'existe et l'argument semflg ne précise pas IPC_CREAT.
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..
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).

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 d'ensembles de sémaphores sur le système.
SEMMSL
Nombre maximal de sémaphores par ensemble.
SEMMNS
Nombre maximal de sémaphores sur le système : dépend de l'implémentation. Les valeurs supérieures à SEMMSL * SEMMNI sont incorrectes.

BOGUES

L'utilisation de IPC_PRIVATE n'empêche pas les autres processus d'accéder au jeu de sémaphores alloué. Le choix de ce mot est malheureux, il aurait mieux valu utiliser IPC_NEW.

Les structures de données associées a chaque sémaphore dans l'ensemble ne sont pas initialisées lors de l'appel système. Pour effectuer cette initialisation, il faut exécuter un appel à semctl(2) avec les commandes SETVAL ou SETALL.

CONFORMITÉ

SVr4, SVID. SVr4 documente des conditions d'erreur supplémentaires EFBIG, E2BIG, EAGAIN, ERANGE, et EFAULT.

VOIR AUSSI

ftok(3), ipc(5), semctl(2), semop(2).

TRADUCTION

Christophe Blaess, 1996-2003.