SHMOP(2)

NOM
shmop, shmat, shmdt - Operations sur la memoire partagee.

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 memoire partagee identifie par shmid au segment de donnees du processus appelant. L'adresse d'attachement est indiquee par shmaddr avec les criteres suivants :

    Si shmaddr vaut 0, le systeme essaye de trouver une zone libre dans l'intervalle 1 - 1.5Go en commencant par l'adresse la plus haute et en descendant jusqu'a trouver l'emplacement adequat.

    Si shmaddr n'est pas nulle et si SHM_RND est indique dans shmflg, l'attachement a lieu a l'adresse shmaddr arrondie au multiple inferieur de SHMLBA. Si SHM_RND n'est pas indique shmaddr doit etre alignee sur une frontiere de page, et l'attachement a lieu a cette adresse.

Si SHM_RDONLY est indique dans shmflg, le segment est attache en lecture seulement, et le processus doit disposer de la permission de lecture dessus. Sinon le segment est attache en lecture et ecriture et le processus doit disposer des deux permissions d'acces. Il n'y a pas de notion d'ecriture seule pour les segments de memoire partagee.

La valeur brk du processus appelant n'est pas alteree par l'attachement. Le segment est automatiquement detache quand le processus se termine. Le meme segment peut etre attache a la fois en lecture seule et en lecture/ecriture. Il peut egalement etre attache en plusieurs endroits de l'espace d'adressage du processus.

Si shmat reussit, les membres de la structre shmid_ds associee a segment de memoire partagee sont mis a jour ainsi :

    shm_atime correspond a l'heure actuelle.

    shm_lpid contient le PID de l'appelant.

    shm_nattch est incremente de 1

Notez que l'attachement reussit meme si le segment de memoire est marque pour destruction.

La fonction shmdt detache le segment de memoire partagee situe a l'adresse indiquee par shmaddr. Le segment doit etre presentement attache, et l'adresse shmaddr doit etre celle renvoyee precedement par shmat.

Quand shmdt reussit, les membres de la structure shmid_ds associee au segment de memoire partagee sont mis a jour ainsi :

    shm_dtime correspond a l'heure actuelle.

    shm_lpid contient le PID de l'appelant.

    shm_nattch est decremente de 1. S'il devient nul, et si le segment est marque pour destruction, il est effectivement detruit.

La region occupee de l'espace d'adressage du processus est liberee.

AUTRES APPELS SYSTEMES

fork()
    Apres un fork() le fils herite des segments de memoire partagee.

exec()
    Apres un exec() tous les segments de memoire partagee sont detaches (pas detruits).

exit()
    Lors d'un exit() tous les segments de memoire partagee sont detaches (pas detruits).

VALEUR RENVOYEE
Les deux fonctions renvoient -1 si elles echouent, auquel cas errno contient le code d'erreur. Sinon shmat renvoie l'adresse d'attachement du segment de memoire partagee, et shmdt renvoie 0.

ERREURS
shmat:

EACCES
    L'appelant n'a pas les permissions d'acces necessaires pour l'attachement.

EINVAL
    shmid est invalide, shmaddr est mal alignee ou l'attachement a echoue sur brk.

ENOMEM
    Pas assez de memoire pour le systeme.

shmdt:

EINVAL.
    Pas de segment attache a l'adresse shmaddr.

NOTES
Au cours d'un fork(2) le fils herite de tous les segments attaches.

Les segments sont detaches durant un execve(2)

Il n'y a pas de limite au nombre de segments de memoire attaches par processus.

CONFORMITE
SVr4, SVID. SVr4 mentionne une condition d'erreur supplementaire EMFILE.

VOIR AUSSI
ipc(5), shmctl(2), shmget(2).