SHMOP(2) Manuel du programmeur Linux SHMOP(2)
NOM
shmop, shmat, shmdt - Opérations sur la mémoire partagée.
SYNOPSIS
# include <sys/types.h>
# include <sys/ipc.h>
# include <sys/shm.h>
char *shmat ( int shmid, char *shmaddr, int shmflg )
int shmdt ( char *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 0, le système essaye de trouver une
zone libre dans l'intervalle 1 - 1.5Go en com
mençant par l'adresse la plus haute et en descen
dant jusqu'à trouver l'emplacement adéquat.
Si shmaddr n'est pas nulle et si SHM_RND est
indiqué dans shmflg, l'attachement a lieu à
l'adresse shmaddr arrondie au multiple inférieur de
SHMLBA. Si SHM_RND n'est pas indiqué shmaddr doit
être alignée sur une frontière de page, et
l'attachement a lieu à cette adresse.
Si SHM_RDONLY est indiqué dans shmflg, le segment est
attaché en lecture seulement, et le processus doit dis
poser de la permission de lecture dessus. Sinon le seg
ment 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.
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.
Linux 15 Avril 1997 1
SHMOP(2) Manuel du programmeur Linux SHMOP(2)
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
l'attachement a échoué sur brk.
ENOMEM Pas assez de mémoire pour le système.
Linux 15 Avril 1997 2
SHMOP(2) Manuel du programmeur Linux SHMOP(2)
shmdt:
EINVAL.
Pas de segment attaché à l'adresse shmaddr.
NOTES
Au cours d'un fork(2) le fils hérite de tous les segments
attachés.
Les segments sont détachés durant un execve(2)
Il n'y a pas de limite au nombre de segments de mémoire
attachés par processus.
CONFORMITÉ
SVr4, SVID. SVr4 mentionne une condition d'erreur
supplémentaire EMFILE.
VOIR AUSSI
ipc(5), shmctl(2), shmget(2).
TRADUCTION
Christophe Blaess, 1997.
Linux 15 Avril 1997 3