NOM
shmat, shmdt - Opérations sur la mémoire partagée System V
SYNOPSIS
#include
<sys/types.h>
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg);
int shmdt(const void *shmaddr);
DESCRIPTION
shmat()
La fonction shmat() attache le segment de
mémoire partagée System V
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 :
* |
If shmaddr is NULL, the system chooses a suitable (unused) page-aligned address to attach the 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. |
En plus de
SHM_RND, les attributs suivants peuvent être
indiqués dans le paramètre de masque
shmflg :
SHM_EXEC (spécifique à Linux, depuis
Linux 2.6.9)
Autoriser l’exécution du contenu du segment. L’appelant doit avoir le disposer du droit d’exécution sur le segment.
SHM_RDONLY
Attacher le segment est en seule. Le processus doit disposer de la permission de lecture dessus. Si cet attribut n’est pas indiqué, 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.
SHM_REMAP (spécifique à Linux)
Cette attribut indique 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(2) 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.
Quand shmat() réussit, les membres de la structure shmid_ds associée au segment de mémoire partagée (consultez shmctl(2)) 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.
shmdt()
La fonction shmdt() détache le segment de
mémoire partagée situé à
l’adresse indiquée par shmaddr. Le
segment doit être effectivement attaché, et
l’adresse shmaddr doit être celle
renvoyée précédemment 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.
VALEUR DE RETOUR
S’il réussit, shmat() renvoie l’adresse d’attachement du segment de mémoire partagée. En cas d’échec (void *) -1 est renvoyé, et errno contient le code d’erreur.
S’il réussit, shmdt() renvoie 0. En cas d’échec, -1 est renvoyé et errno contient le code d’erreur.
ERREURS
Quand shmat() échoue, errno prend l’une des valeurs suivantes :
EACCES |
The calling process does not have the required permissions for the requested attach type, and does not have the CAP_IPC_OWNER capability in the user namespace that governs its IPC namespace. | ||
EIDRM |
shmid pointe sur un segment détruit. | ||
EINVAL |
shmid est invalide, shmaddr est mal alignée (c’est-à-dire pas alignée sur une page et SHM_RND n’a pas été précisé) ou invalide, échec lors de l’attachement à shmaddr, ou SHM_REMAP a été réclamé et shmaddr est NULL. | ||
ENOMEM |
Pas assez de mémoire pour le système. |
Quand shmdt() échoue, errno prend l’une des valeurs suivantes :
EINVAL |
Aucun segment de mémoire partagée n’est attaché à l’adresse shmaddr, ou bien shmaddr n’est pas un multiple de la taille de page. |
CONFORMITÉ
POSIX.1-2001, POSIX.1-2008, SVr4.
In SVID 3 (or perhaps earlier), the type of the shmaddr argument was changed from char * into const void *, and the returned type of shmat() from char * into void *.
NOTES
Après un fork(2), le fils hérite des segments de mémoire partagée.
Après un execve(2), tous les segments de mémoire partagée sont détachés (pas détruits).
Lors d’un _exit(2), tous les segments de mémoire partagée sont détachés (pas détruits).
Utiliser shmat() avec shmaddr égale à NULL est la manière conseillée, portable, d’attacher un segment de mémoire partagée. 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ée doit être relatif (typiquement par rapport au début du segment) et pas absolu.
On Linux, it is possible to attach a shared memory segment even if it is already marked to be deleted. However, POSIX.1 does not specify this behavior and many other implementations do not support it.
Le paramètre système suivant influe sur shmat() :
SHMLBA |
Segment low boundary address multiple. When explicitly specifying an attach address in a call to shmat(), the caller should ensure that the address is a multiple of this value. This is necessary on some architectures, in order either to ensure good CPU cache performance or to ensure that different attaches of the same segment have consistent views within the CPU cache. SHMLBA is normally some multiple of the system page size. (On many Linux architectures, SHMLBA is the same as the system page size.) |
L’implémentation n’a pas de limite intrinsèque par processus pour le nombre maximal de segments de mémoire partagée (SHMSEG).
VOIR AUSSI
brk(2), mmap(2), shmctl(2), shmget(2), capabilities(7), shm_overview(7), sysvipc(7)
COLOPHON
Cette page fait partie de la publication 5.05 du projet man-pages Linux. Une description du projet et des instructions pour signaler des anomalies peuvent être trouvées à l’adresse https://www.kernel.org/doc/man-pages/.
TRADUCTION
La traduction française de cette page de manuel a été créée par Christophe Blaess <http://www.blaess.fr/christophe/>, Stéphan Rafin <stephan.rafin [AT] laposte.net>, Thierry Vignaud <tvignaud [AT] mandriva.com>, François Micaux, Alain Portal <aportal [AT] univ-montp2.fr>, Jean-Philippe Guérard <fevrier [AT] tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon [AT] wanadoo.fr>, Julien Cristau <jcristau [AT] debian.org>, Thomas Huriaux <thomas.huriaux [AT] gmail.com>, Nicolas François <nicolas.francois [AT] centraliens.net>, Florentin Duneau <fduneau [AT] gmail.com>, Simon Paillard <simon.paillard [AT] resel.fr>, Denis Barbier <barbier [AT] debian.org> et David Prévot <david [AT] tilapin.org>
Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n’y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à <debian-l10n-french [AT] lists.org>.