semget(2) System Calls Manual semget(2) NOM semget - Obtenir l'identifiant d'un ensemble de semaphores System V BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include int semget(key_t key, int nsems, int semflg); DESCRIPTION L'appel systeme semget() renvoie l'identifiant de l'ensemble de semaphores System V associe a la valeur de cle key. Cela peut servir pour obtenir l'identifiant d'un ensemble de semaphores cree precedemment (lorsque semflg vaut 0 et que key n'a pas la valeur IPC_PRIVATE) ou pour creer un nouvel ensemble. Un nouvel ensemble contenant nsems semaphores est cree si key a la valeur IPC_PRIVATE ou si aucun ensemble n'est associe a key, et si l'option IPC_CREAT est presente dans semflg. Si semflg contient a la fois IPC_CREAT et IPC_EXCL et qu'un ensemble de semaphores existe deja pour la cle key, semget() echoue et errno vaut EEXIST. (Cela est analogue a l'effet de la combinaison O_CREAT | O_EXCL pour open(2).) Pendant la creation, les 9 bits de poids faible de l'argument semflg definissent les permissions d'acces (pour le proprietaire, le groupe et les autres) au jeu de semaphores, en utilisant le meme format et la meme signification que les droits d'acces dans open(2). Les permissions d'execution ne sont pas utilisees par le systeme, et pour un jeu de semaphores, l'autorisation d'ecriture signifie autorisation de modification. Durant la creation, la structure de donnees semid_ds (consultez semctl(2)) controlant le jeu de semaphores est initialisee 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 faible de sem_perm.mode contiennent les 9 bits de poids faible de semflg. - sem_nsems recoit 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 systeme n'est pas une creation d'ensemble de semaphores. Autrement nsems doit etre superieur a 0 et inferieur ou egal au nombre maximal de semaphores par ensemble (SEMMSL). Si le jeu de semaphores existe deja, les permissions d'acces sont controlees. VALEUR RENVOYEE En cas de reussite, semget() renvoie l'identifiant de l'ensemble de semaphores (un entier positif). En cas d'echec, il renvoie -1 et errno contient le code d'erreur. ERREURS EACCES Le jeu de semaphores associe a key existe, mais le processus n'a aucun droit d'acces sur lui et n'a pas la capacite CAP_IPC_OWNER dans l'espace de noms utilisateur qui regit son espace de noms IPC. EEXIST IPC_CREAT et IPC_EXCL ont ete tous les deux indiques dans semflag, mais un ensemble de semaphores de cle key existe deja. EINVAL nsems est inferieur a zero ou superieur a la limite du nombre de semaphores par ensemble, (SEMMSL). EINVAL Un ensemble de semaphores identifie par key existe deja, mais nsems est plus grand que le nombre de semaphores par ensemble. ENOENT Aucun jeu de semaphores associe a key n'existe et l'argument semflg ne precise pas IPC_CREAT. ENOMEM Pas assez de memoire pour creer les structures necessaires. ENOSPC Le nombre maximal de jeux de semaphores sur le systeme (SEMMNI) est atteint, ou le nombre maximal de semaphores sur le systeme est atteint (SEMMNS). STANDARDS POSIX.1-2008. HISTORIQUE 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 speciale dans l'argument key, l'appel systeme ne se preoccupera que des 9 bits de poids faible de semflg et tentera de creer un nouveau jeu de semaphores. Initialisation des semaphores Les valeurs des semaphores dans un ensemble qui vient d'etre cree sont indeterminees (POSIX.1-2001 et POSIX.1-2008 sont explicites sur ce point, bien que POSIX.1-2008 note que de futures versions du standard pourraient exiger des implementations qu'elles initialisent les semaphores a 0). Meme si Linux, comme de nombreuses autres implementations, initialise les valeurs des semaphores a 0, une application portable ne peut pas compter sur cette initialisation : elle doit initialiser explicitement les semaphores a la valeur souhaitee. L'initialisation peut etre effectuee avec les operations SETVAL ou SETALL de la fonction semctl(2). Lorsque plusieurs concurrents ne savent pas qui sera le premier a initialiser le jeu de semaphores, il est possible de verifier que le membre sem_otime de la structure recuperee par une operation IPC_STAT de semctl(2) est non nul pour eviter les conditions de concurrence. Limites des semaphores Les limites suivantes de ressources concernent l'appel systeme semget() : SEMMNI Limite systeme du nombre de jeux de semaphores. Avant Linux 3.19, la valeur par defaut pour cette limite etait de 128. Depuis Linux 3.19, elle est de 32 000. Sous Linux, cette limite peut etre lue et modifiee dans le quatrieme champ de /proc/sys/kernel/sem. SEMMSL Nombre maximal de semaphores par ensemble. Avant Linux 3.19, la valeur par defaut pour cette limite etait de 250. Depuis Linux 3.19, elle est de 32 000. Sous Linux, cette limite peut etre lue et modifiee dans le premier champ de /proc/sys/kernel/sem. SEMMNS Limite systeme du nombre de semaphores : depend de la politique (sous Linux, cette limite peut etre lue et modifiee dans le second champ de /proc/sys/kernel/sem). Le nombre de semaphores est egalement limite par le produit de SEMMSL et SEMMNI. BOGUES Le choix du nom IPC_PRIVATE est malheureux, IPC_NEW aurait mieux decrit sa fonction. EXEMPLES Le programme montre ci-dessous utilise semget() pour creer un nouveau jeu de semaphores ou recupere l'identifiant d'un jeu existant. Il genere la key pour semget() en utilisant ftok(3). Les deux premiers arguments de la ligne de commande sont utilises comme arguments de chemin pathname et proj_id pour ftok(3). Le troisieme argument de la ligne de commande est un entier qui specifie l'argument nsems pour semget(). Les options en ligne de commande peuvent etre utilisees pour specifier les attributs IPC_CREAT (-c) et IPC_EXCL (-x) pour l'appel a semget(). L'utilisation de ce programme est expliquee ci-dessous. Sont crees en premier deux fichiers qui seront utilises pour generer les cles avec ftok(3), puis deux jeux de semaphores utilisant ces fichiers et enfin, les jeux sont listes avec ipcs(1): $ touch mykey mykey2 $ ./t_semget -c mykey p 1 ID = 9 $ ./t_semget -c mykey2 p 2 ID = 10 $ ipcs -s ------ Semaphore Arrays -------- key semid owner perms nsems 0x7004136d 9 mtk 600 1 0x70041368 10 mtk 600 2 Ensuite, il est demontre que quand semctl(2) recoit la meme key (puisque generee par les memes arguments passes a ftok(3)), il renvoie l'identifiant du jeu de semaphore deja existant : $ ./t_semget -c mykey p 1 ID = 9 Finalement, il est montre quel type de collision peut survenir si ftok(3) recoit des arguments de chemin pathname differents qui possedent le meme numero d'inode : $ ln mykey link $ ls -i1 link mykey 2233197 link 2233197 mykey $ ./t_semget link p 1 # Genere la meme cle que 'mykey' ID = 9 Source du programme /* t_semget.c Sous licence GNU General Public v2 ou posterieure. */ #include #include #include #include #include static void usage(const char *pname) { fprintf(stderr, "Utilisation : %s [-cx] pathname proj-id num-sems\n", pname); fprintf(stderr, " -c Use IPC_CREAT flag\n"); fprintf(stderr, " -x Use IPC_EXCL flag\n"); exit(EXIT_FAILURE); } int main(int argc, char *argv[]) { int semid, nsems, flags, opt; key_t key; flags = 0; while ((opt = getopt(argc, argv, "cx")) != -1) { switch (opt) { case 'c': flags |= IPC_CREAT; break; case 'x': flags |= IPC_EXCL; break; default: usage(argv[0]); } } if (argc != optind + 3) usage(argv[0]); key = ftok(argv[optind], argv[optind + 1][0]); if (key == -1) { perror("ftok"); exit(EXIT_FAILURE); } nsems = atoi(argv[optind + 2]); semid = semget(key, nsems, flags | 0600); if (semid == -1) { perror("semget"); exit(EXIT_FAILURE); } printf("ID = %d\n", semid); exit(EXIT_SUCCESS); } VOIR AUSSI semctl(2), semop(2), ftok(3), capabilities(7), sem_overview(7), sysvipc(7) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot , Thomas Vincent et Jean- Pierre Giraud Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.8 2 mai 2024 semget(2)