SEMGET(2)

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
L'appel système semget() 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.

Si semflg indique à la fois IPC_CREAT et IPC_EXCL et si un sémaphore associé a key existe déjà, alors semget() échouera en remplissant errno avec 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 (pour le propriétaire, le groupe et les autres) du jeu de sémaphores, en utilisant le même format et la même signification que l'argument mode dans open(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.

Les valeurs des sémaphores dans un ensemble nouvellement créé sont indéterminées. (POSIX.1-2001 est explicite sur ce point) Bien que Linux, comme beaucoup d'autres implémentations, initialise les valeurs des sémaphores à 0, un application portable ne devrait pas compter dessus : elle devrait explicitement initialiser les sémaphores aux valeurs souhaitées.

Durant la création d'un nouveau jeu de sémaphores, semget() initialise la structure de données semid_ds associée (voir semctl(2)) de la manière suivante :

    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 sont remplis avec 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 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

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
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. Sous Linux, cette limite peut être lue et modifiée via le quatrième champ de /proc/sys/kernel/sem).

SEMMSL
    Nombre maximal de sémaphores par ensemble. Sous Linux, cette limite peut être lue et modifiée via le premier champ de /proc/sys/kernel/sem).

SEMMNS
    Nombre maximal de sémaphores sur le système : dépend de l'implémentation. Sous Linux, cette limite peut être lue et modifiée via le deuxième champ de /proc/sys/kernel/sem). 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 sémaphores dans un jeu ne sont pas initialisés par semget(). Afin d'initialiser les sémaphores, semctl(2) doit être utilisé pour effectuer une opération SETVAL ou SETALL sur le jeu de sémaphores. (Puisque de multiples pairs ne savent pas qui sera le premier à initialiser le jeu, la vérification d'une valeur non nulle pour sem_otime dans la structure de donnée associée renvoyée par l'opération IPC_STAT de semctl(2) permettra d'éviter toute condition de concurrence.

VOIR AUSSI
semctl(2), semop(2), ftok(3), capabilities(7), sem_overview(7), svipc(7)

TRADUCTION

Ce document est une traduction réalisée par Christophe Blaess <http://www.blaess.fr/christophe/> le 15 octobre 1996 et révisée le 22 décembre 2007.

L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 2 semget ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.