shmget()
renvoie l'identificateur du segment de mémoire partagée
associé à la valeur de l'argument
clé.
Un nouveau segment mémoire, de taille
size
arrondie au multiple supérieur de
PAGE_SIZE,
est créé si
clé
a la valeur
IPC_PRIVATE
ou si aucun segment de mémoire partagée n'est associé à
clé,
et
IPC_CREAT
est présent dans
shmflg.
Si
shmflg
indisue à la fois
IPC_CREAT
et
IPC_EXCL
et qu'un segment de mémoire partagée existe déjà pour
key,
alors
shmget()
échouera et
errno
contiendra
EEXIST.
(Ceci est analogue à l'effet de la combinaison
O_CREAT | O_EXCL
pour
open(2).)
shmflg
est composé de :
-
- IPC_CREAT
-
pour créer un nouveau segment.
Sinon
shmget()
recherchera le segment associé à
clé,
vérifiera que l'appelant a la permission de recevoir l'identifiant
shmid
associé au segment, et contrôlera que le segment n'est pas détruit.
-
- IPC_EXCL
-
est utilisé avec
IPC_CREAT
pour garantir l'échec si le segment existe déjà.
- mode d'accès
-
(les 9 bits de poids faibles)
indiquant les permissions pour le propriétaire, le groupe et les autres.
Ces bits ont le même format et la même signification que l'argument
mode
de
open(2).
Actuellement la permission d'exécution n'est pas utilisée
par le système.
-
- SHM_HUGETLB (depuis Linux 2.6)
-
Allouer le segment en utilisant des "pages énormes" (Ndt : huge pages).
Voir le fichier
Documentation/vm/hugetlbpage.txt
dans la documentation des sources du noyau pour plus d'informations.
-
- SHM_NORESERVE (depuis Linux 2.6.15)
-
Cet attribut sert à la même chose que l'attribut
MAP_NORESERVE
de
mmap(2).
Ne pas réserver d'espace de swap pour ce segment.
Une telle réservation garantit que l'on puisse modifier le segment.
Sans réservation, on peut recevoir un signal
SIGSEGV
durant une écriture,
s'il n'y a plus de mémoire physique disponible.
Voir également la discussion sur le fichier
/proc/sys/vm/overcommit_memory
dans
proc(5).
Lorsqu'un nouveau segment de mémoire partagé est créé, son contenu est
initialisé avec des valeurs nulles, et sa structure de données associée
shmid_ds
(voir
shmctl(2))
est initialisée de la manière suivante :
-
shm_perm.cuid
et
shm_perm.uid
contiennent l'UID effectif de l'appelant.
-
shm_perm.cgid
et
shm_perm.gid
contiennent le GID effectif de l'appelant.
-
Les 9 bits de poids faibles de
shm_perm.mode
contiennent les 9 bits de poids faibles de
shmflg.
-
shm_segsz
prend la valeur
size.
-
shm_lpid,
shm_nattch,
shm_atime
et
shm_dtime
sont mis à 0.
-
shm_ctime
contient l'heure actuelle
Si le segment de mémoire existe déjà, les permissions sont vérifiées,
et un contrôle a lieu pour voir s'il est marqué pour destruction.