Index général des pages de man   Index Section man 2   Table des Matières de mmap   Imprime la page de man mmap en mode Texte   Recherche dans les pages de man   Page de man en français      Fonctions du système (section 2)

mmap

 
  

Nom

mmap, munmap - Etablir / supprimer une projection en mémoire (map / unmap) des fichiers ou des périphériques.

Synopsis

#include <unistd.h>
#include <sys/mman.h>

#ifdef _POSIX_MAPPED_FILES

void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);

int munmap(void *start, size_t length);

#endif

Description

La fonction mmap demande la projection en mémoire de length octets commencant à la position offset depuis un fichier (ou un autre objet) indiqué par le descripteur fd, de préférence à l'adresse pointée par start. Cette adresse n'est qu'une préférence, généralement 0. La véritable adresse où l'objet est projeté est renvoyée par la fonction mmap.

L'argument prot indique la protection que l'on désire pour cette zone de mémoire, et ne doit pas entrer en conflit avec le mode d'ouverture du fichier. Les protections possibles sont les suivantes :

PROT_EXEC
On peut exécuter du code dans la zone mémoire.
PROT_READ
On peut lire le contenu de la zone mémoire
PROT_WRITE
On peut écrire dans la zone mémoire.
PROT_NONE
Le contenu de la zone memoire est inaccessible.

Le paramètre flags indique le type de fichier projeté, les options de projection, et si les modifications faites sur la portion projetée sont privées ou doivent être partagées avec les autres références. Les options sont :

MAP_FIXED
N'utiliser que l'adresse indiquée. Si c'est impossible, mmap échouera. Si MAP_FIXED est spécifié start doit être un multiple de la longueur de page. Il est déconseillé d'utiliser cette option.
MAP_SHARED
Partager la projection avec tout autre processus utilisant l'objet. L'écriture dans la zone est équivalente à une écriture dans le fichier. Par contre ce dernier n'est pas nécessairement mis à jour tant qu'on n'a pas appelé msync(2) ou mumap(2) .
MAP_PRIVATE
Créer une projection privée, utilisant la méthode de copie à l'écriture. L'écriture dans la zone ne modifie pas le fichier.

Vous devez indiquer soit MAP_SHARED, soit MAP_PRIVATE.

Ces trois attributs sont décrits dans POSIX.1b (anciennement POSIX.4). Linux propose également les options MAP_DENYWRITE, MAP_EXECUTABLE MAP_NORESERVE, MAP_LOCKED MAP_GROWSDOWN et MAP_ANON(YMOUS).

L'argument offset doit normalement être un multiple de la taille de page renvoyée par l'appel getpagesize(2) .

L'appel système munmap détruit la projection dans la zone de mémoire spécifiée, et s'arrange pour que toute référence ultérieure à cette zone mémoire déclenche une erreur d'adressage. La projection est aussi automatiquement détruite lorsque le processue se termine. À l'inverse, la fermeture du descripteur de fichier ne supprime pas la projection.

Valeur Renvoyée

mmap renvoie un pointeur sur la zone de mémoire, s'il réussit. En cas d'échec il retourne MAP_FAILED (-1) et errno contient le code d'erreur.

munmap renvoie 0 s'il réussit. En cas d'échec -1 est renvoyé et errno contient le code d'erreur (probablement EINVAL).

Erreurs

EBADF
fd n'est pas un descripteur de fichier valide (et MAP_ANONYMOUS n'était pas précisé).
EACCES
On demande une projection privée MAP_PRIVATE mais fd n'est pas ouvert en lecture, ou on demande une projection partagée MAP_SHARED avec protection PROT_WRITE, mais fd n'est pas ouvert en lecture et ecriture (O_RDWR).
EINVAL
start ou length ou offset sont invalides. (par exemple : zone trop grande, ou non alignée sur une frontière de page).
ETXTBSY
MAP_DENYWRITE a été réclamé mais fd est ouvert en écriture
EAGAIN
Le fichier est verrouillé, ou trop de mémoire est verrouillée.
ENOMEM
pas assez de mémoire.

L'accès à une zone de projection peut déclencher les signaux suivants :

SIGSEGV
Tentative d'écriture dans une zone en lecture seule
SIGBUS
Tentative d'accès à une portion de la zone qui ne correspond pas au fichier (par exemple après la fin du fichier, y compris lorsqu'un autre fichier l'a tronqué).

Conformité

SVr4, POSIX.1b (anciennement POSIX.4), BSD 4.4. SVr4 documente les codes d'erreur supplémentaires ENXIO et ENODEV.

Voir Aussi

getpagesize(2) , msync(2) , shm_open(2) , B.O. Gallmeister, POSIX.4, O'Reilly, pp. 119-124 et 365-369.

Traduction

Christophe Blaess, 1997.


Table des matières


Haut de page

© 1996-2000 Adaptation française "Christophe Blaess"