Man page - semget(2)

Packages contains this manual

Available languages:

en fr pl ja ru

Manual

semget

NOM
BIBLIOTHÈQUE
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
ERREURS
STANDARDS
HISTORIQUE
NOTES
Initialisation des sémaphores
Limites des sémaphores
BOGUES
EXEMPLES
Source du programme
VOIR AUSSI
TRADUCTION

NOM

semget - Obtenir l’identifiant d’un ensemble de sĂ©maphores System V

BIBLIOTHÈQUE

BibliothĂšque C standard ( libc , -lc )

SYNOPSIS

#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 . Cela peut servir pour obtenir l’identifiant d’un ensemble de sĂ©maphores créé prĂ©cĂ©demment (lorsque semflg vaut 0 et que key n’a pas la valeur IPC_PRIVATE ) ou pour crĂ©er un nouvel ensemble.

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 . (Cela est analogue Ă  l’effet de la combinaison O_CREAT | O_EXCL pour open (2).)

Pendant la crĂ©ation, les 9 bits de poids faible 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.

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 faible de sem_perm.mode contiennent les 9 bits de poids faible 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 (ignorĂ©) 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

En cas de rĂ©ussite, semget () renvoie l’identifiant de l’ensemble de sĂ©maphores (un entier positif). En cas d’échec, il renvoie -1 et errno contient le code d’erreur.

ERREURS

EACCES

Le jeu de sĂ©maphores associĂ© Ă  key existe, mais le processus n’a aucun droit d’accĂšs sur lui et n’a pas la capacitĂ© CAP_IPC_OWNER dans l’espace de noms utilisateur qui rĂ©git son espace de noms IPC.

EEXIST

IPC_CREAT et IPC_EXCL ont été tous les deux indiqués dans semflag , mais un ensemble de sémaphores de clé key existe déjà.

EINVAL

nsems est inférieur à zéro ou supérieur à la limite du nombre de sémaphores par ensemble, ( SEMMSL ).

EINVAL

Un ensemble de sémaphores identifié par key existe déjà, mais nsems est plus grand que le nombre de sémaphores par ensemble.

ENOENT

Aucun jeu de sĂ©maphores 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 ).

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 spĂ©ciale dans l’argument key , l’appel systĂšme ne se prĂ©occupera que des 9 bits de poids faible de semflg et tentera de crĂ©er un nouveau jeu de sĂ©maphores.

Initialisation des sémaphores

Les valeurs des sĂ©maphores dans un ensemble qui vient d’ĂȘtre créé sont indĂ©terminĂ©es (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 implĂ©mentations qu’elles initialisent les sĂ©maphores à 0). 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.

L’initialisation peut ĂȘtre effectuĂ©e avec les opĂ©rations SETVAL ou SETALL de la fonction semctl (2). Lorsque plusieurs concurrents ne savent pas qui sera le premier Ă  initialiser le jeu de sĂ©maphores, il est possible de vĂ©rifier que le membre sem_otime de la structure rĂ©cupĂ©rĂ©e par une opĂ©ration IPC_STAT de semctl (2) est non nul pour Ă©viter les conditions de concurrence.

Limites des sémaphores

Les limites suivantes de ressources concernent l’appel systùme semget () :

SEMMNI

Limite systĂšme du nombre de jeux de sĂ©maphores. Avant Linux 3.19, la valeur par dĂ©faut pour cette limite Ă©tait de 128. Depuis Linux 3.19, elle est de 32 000. 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. Avant Linux 3.19, la valeur par dĂ©faut pour cette limite Ă©tait de 250. Depuis Linux 3.19, elle est de 32 000. Sous Linux, cette limite peut ĂȘtre lue et modifiĂ©e dans le premier champ de /proc/sys/kernel/sem .

SEMMNS

Limite systĂšme du nombre de sĂ©maphores : dĂ©pend de la politique (sous Linux, cette limite peut ĂȘtre lue et modifiĂ©e dans le second champ de /proc/sys/kernel/sem ). Le nombre de sĂ©maphores est Ă©galement limitĂ© par le produit de SEMMSL et SEMMNI .

BOGUES

Le choix du nom IPC_PRIVATE est malheureux, IPC_NEW aurait mieux décrit sa fonction.

EXEMPLES

Le programme montrĂ© ci-dessous utilise semget () pour crĂ©er un nouveau jeu de sĂ©maphores ou rĂ©cupĂšre l’identifiant d’un jeu existant. Il gĂ©nĂšre la key pour semget () en utilisant ftok (3). Les deux premiers arguments de la ligne de commande sont utilisĂ©s comme arguments de chemin pathname et proj_id pour ftok (3). Le troisiĂšme argument de la ligne de commande est un entier qui spĂ©cifie l’argument nsems pour semget (). Les options en ligne de commande peuvent ĂȘtre utilisĂ©es pour spĂ©cifier les attributs IPC_CREAT ( -c ) et IPC_EXCL ( -x ) pour l’appel Ă  semget (). L’utilisation de ce programme est expliquĂ©e ci-dessous.

Sont créés en premier deux fichiers qui seront utilisés pour générer les clés avec ftok (3), puis deux jeux de sémaphores utilisant ces fichiers et enfin, les jeux sont listés 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 dĂ©montrĂ© que quand semctl (2) reçoit la mĂȘme key (puisque gĂ©nĂ©rĂ©e par les mĂȘmes arguments passĂ©s Ă  ftok (3)), il renvoie l’identifiant du jeu de sĂ©maphore dĂ©jĂ  existant :

$ ./t_semget -c mykey p 1
ID = 9

Finalement, il est montrĂ© quel type de collision peut survenir si ftok (3) reçoit des arguments de chemin pathname diffĂ©rents qui possĂšdent le mĂȘme numĂ©ro d’inode :

$ ln mykey link
$ ls -i1 link mykey
2233197 link
2233197 mykey
$ ./t_semget link p 1 # GĂ©nĂšre la mĂȘme clĂ© que 'mykey'
ID = 9

Source du programme

/* t_semget.c
Sous licence GNU General Public v2 ou postérieure.
*/
#include <stdio.h>
#include <stdlib.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <unistd.h>
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 française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org>, Thomas Vincent <tvincent@debian.org> et Jean-Pierre Giraud <jean-pierregiraud@neuf.fr>

Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.

Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org .