Linux

CentOS 4.8

shmdt(2)


SHMOP

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 0, le système essaye de trouver une zone libre dans l’intervalle 1 - 1.5Go en commençant par l’adresse la plus haute et en descendant 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 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.

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 l’attachement a échoué sur brk.

ENOMEM

Pas assez de mémoire pour le système.

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.


shmdt(2)