Provided by:
manpages-fr-dev_3.32d0.2p4-1_all 
NOM
shmat, shmdt - Operations sur la memoire partagee
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 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 NULL, le systeme essaye de trouver une adresse libre
pour attacher le segment.
Si shmaddr n'est pas NULL et si SHM_RND est indique dans shmflg,
l'attachement a lieu a l'adresse shmaddr arrondie au multiple inferieur
de SHMLBA. Sinon shmaddr doit etre alignee sur une frontiere de page,
ou l'attachement a lieu.
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.
L'option (specifique a Linux) SHM_REMAP peut etre ajoutee dans shmflg
pour indiquer que la projection du segment doit remplacer une
projection precedente dans l'intervalle commencant en shmaddr et
s'etendant sur la taille du segment. (Normalement une erreur EINVAL se
produirait si une projection existait deja dans l'intervalle indique.)
Dans ce cas, shmaddr ne doit pas etre NULL.
La valeur brk(2) 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.
Quand shmat() reussit, les membres de la structure shmid_ds associee au
segment de memoire partagee (consultez shmctl(2)) 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.
La fonction shmdt() detache le segment de memoire partagee situe a
l'adresse indiquee par shmaddr. Le segment doit etre effectivement
attache, et l'adresse shmaddr doit etre celle renvoyee precedemment 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.
Apres un fork(2) le fils herite des segments de memoire partagee.
Apres un execve(2) tous les segments de memoire partagee sont detaches
(pas detruits).
Lors d'un _exit(2) tous les segments de memoire partagee sont detaches
(pas detruits).
VALEUR RENVOY'EE
S'il reussit, shmat() renvoie l'adresse d'attachement du segment de
memoire partagee. En cas d'echec (void *) -1 est renvoye, et errno
contient le code d'erreur.
shmdt() renvoie zero s'il reussit et -1 s'il echoue et ecrit la cause
de l'erreur dans errno.
ERREURS
Quand shmat() echoue, errno prend l'une des valeurs suivantes :
EACCES L'appelant n'a pas les permissions d'acces necessaires pour
l'attachement, et n'a pas la capacite CAP_IPC_OWNER.
EINVAL shmid est invalide, shmaddr est mal alignee (c'est-a-dire pas
alignee sur une page et SHM_RND n'a pas ete precise) ou
invalide, echec lors de l'attachement a shmaddr, ou SHM_REMAP a
ete reclame et shmaddr est NULL.
ENOMEM Pas assez de memoire pour le systeme.
Quand shmdt() echoue, errno prend l'une des valeurs suivantes :
EINVAL Aucun segment de memoire partagee n'est attache a l'adresse
shmaddr, ou bien shmaddr n'est pas un multiple de la taille de
page.
CONFORMIT'E
SVr4, POSIX.1-2001.
Dans SVID 3 (ou peut etre auparavant) le type de l'argument shmaddr a
ete modifie de char * en const void *, et le type de retour de shmat()
de char * en void *. (Les bibliotheques Linux libc4 et libc5 avaient le
prototype char *, la glibc 2 celui avec void *).
NOTES
Utiliser shmat() avec shmaddr egale a NULL est la maniere conseillee,
portable, d'attacher un segment de memoire partagee. Soyez conscients
que le segment attache de cette maniere peut l'etre a des adresses
differentes dans les differents processus. Ainsi, tout pointeur contenu
dans la memoire partagee doit etre relatif (typiquement par rapport au
debut du segment) et pas absolu.
Sous Linux, il est possible d'attacher un segment de memoire partagee
qui est deja marque pour effacement. Cependant, ce comportement n'est
pas decrit par POSIX.1-2001, et beaucoup d'autres implementations ne le
permettent pas.
Les parametres systeme suivants influent sur shmat() :
SHMLBA Multiple pour l'adresse de debut de segment. Doit etre aligne
sur une frontiere de page. Pour l'implementation actuelle,
SHMLBA a la meme valeur que PAGE_SIZE.
L'implementation n'a pas de limite intrinseque pour le nombre maximal
de segments de memoire partagee par processus (SHMSEG).
VOIR AUSSI
brk(2), mmap(2), shmctl(2), shmget(2), capabilities(7),
shm_overview(7), svipc(7)
COLOPHON
Cette page fait partie de la publication 3.32 du projet man-pages
Linux. Une description du projet et des instructions pour signaler des
anomalies peuvent etre trouvees a l'adresse
<URL:http://www.kernel.org/doc/man-pages/>.
TRADUCTION
Depuis 2010, cette traduction est maintenue a l'aide de l'outil po4a
<URL:http://po4a.alioth.debian.org/> par l'equipe de traduction
francophone au sein du projet perkamon
<URL:http://perkamon.alioth.debian.org/>.
Christophe Blaess <URL:http://www.blaess.fr/christophe/> (1996-2003),
Alain Portal <URL:http://manpagesfr.free.fr/> (2003-2006). Julien
Cristau et l'equipe francophone de traduction de Debian (2006-2009).
Veuillez signaler toute erreur de traduction en ecrivant a
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet manpages-fr.
Vous pouvez toujours avoir acces a la version anglaise de ce document
en utilisant la commande << man -L C <section> <page_de_man> >>.