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
TRADUCTION
Christophe Blaess, 1996-2003.