man shmop (Appels systèmes) - Opérations sur la mémoire partagée.

NOM

shmop, shmat, shmdt - Opérations sur la mémoire partagée.

SYNOPSIS

#include <sys/types.h>
#include <sys/shm.h>

void *shmat ( int shmid, const void * shmaddr, int shmflg); int shmdt (const void * shmaddr);

DESCRIPTION

La fonction shmat attache le segment de mémoire partagée identifié par shmid au segment de données du processus appelant. L'adresse d'attachement est indiquée par shmaddr avec les critères suivants :

Si shmaddr vaut NULL, le système essaye de trouver une adresse libre pour attacher le segment.
Si shmaddr n'est pas NULL et si SHM_RND est indiqué dans shmflg, l'attachement a lieu à l'adresse shmaddr arrondie au multiple inférieur de SHMLBA. Sinon shmaddr doit être alignée sur une frontière de page, où l'attachement a lieu.

Si SHM_RDONLY est indiqué dans shmflg, le segment est attaché en lecture seulement, et le processus doit disposer de la permission de lecture dessus. Sinon le segment est attaché en lecture et écriture et le processus doit disposer des deux permissions d'accès. Il n'y a pas de notion d'écriture seule pour les segments de mémoire partagée.

L'option (spécifique à Linux) SHM_REMAP peut être ajoutée dans shmflg pour indiquer que la projection du segment doit remplacer une projection précédente dans l'intervalle commençant en shmaddr et s'étendant sur la taille du segment. (Normalement une erreur EINVAL se produirait si une projection existait déjà dans l'intervalle indiqué). Dans ce cas, shmaddr ne doit pas être NULL.

La valeur brk du processus appelant n'est pas altérée par l'attachement. Le segment est automatiquement détaché quand le processus se termine. Le même segment peut être attaché à la fois en lecture seule et en lecture/écriture. Il peut également être attaché en plusieurs endroits de l'espace d'adressage du processus.

Si shmat réussit, les membres de la structure shmid_ds associée au segment de mémoire partagée sont mis à jour ainsi :

shm_atime correspond à l'heure actuelle.
shm_lpid contient le PID de l'appelant.
shm_nattch est incrémenté de 1

Notez que l'attachement réussit même si le segment de mémoire est marqué pour destruction.

La fonction shmdt détache le segment de mémoire partagée situe à l'adresse indiquée par shmaddr. Le segment doit être effectivement attaché, et l'adresse shmaddr doit être celle renvoyée précédement par shmat.

Quand shmdt réussit, les membres de la structure shmid_ds associée au segment de mémoire partagée sont mis à jour ainsi :

shm_dtime correspond à l'heure actuelle.
shm_lpid contient le PID de l'appelant.
shm_nattch est décrémenté de 1. S'il devient nul, et si le segment est marqué pour destruction, il est effectivement détruit.

La région occupée de l'espace d'adressage du processus est libérée.

AUTRES APPELS SYSTÈMES

fork()
Après un fork() le fils hérite des segments de mémoire partagée.
exec()
Après un exec() tous les segments de mémoire partagée sont détachés (pas détruits).
exit()
Lors d'un exit() tous les segments de mémoire partagée sont détachés (pas détruits).

VALEUR RENVOYÉE

Les deux fonctions renvoient -1 si elles échouent, auquel cas errno contient le code d'erreur. Sinon shmat renvoie l'adresse d'attachement du segment de mémoire partagée, et shmdt renvoie 0.

ERREURS

shmat :

EACCES
L'appelant n'a pas les permissions d'accès nécessaires pour l'attachement.
EINVAL
shmid est invalide, shmaddr est mal alignée, ou SH_REMAP a été réclamé et shmaddr est NULL.
ENOMEM
Pas assez de mémoire pour le système.

shmdt :

EINVAL.
Pas de segment attaché à l'adresse shmaddr.

NOTES

Utiliser shmat avec shmaddr éggale à NULL est la manière conseillée, portable, d'attecher un segment de mémoire partagé. Soyez conscients que le segment attaché de cette manière peut l'être à des adresses différentes dans les différents processus. Ainsi, tout pointeur contenu dans la mémoire partagé doit être relatif (typiquement par rapport au début du segment) et pas absolu.

Les paramètres système suivant influent sur shmat :

SHMLBA
Multiple pour l'adresse de début de segment. Doit être aligné sur une frontière de page. Pour l'implémentation actuelle, SHMBLA à la même valeur que PAGE_SIZE.

L'implémentation n'a pas de limite intrinsèque pour le nombre maximal de segment de mémoire partagée par processus. (SHMSEG).

CONFORMITÉ

SVr4, SVID. SVr4 mentionne une condition d'erreur supplémentaire EMFILE. Dans SVID-v4 le type de l'argument shmaddr a été modifié de char * en const void *, et le type de retour de shmat() de char * en void *. (Les bibliothèques Linux libc4 et libc5 avaient le prototype char * , la GlibC 2 celui void *).

VOIR AUSSI

brk(2), ipc(5), mmap(2), shmctl(2), shmget(2).

TRADUCTION

Christophe Blaess, 1996-2003.

CETTE PAGE DOCUMENTE AUSSI :