mmap | Début | Suivant | Sommaire | Préc.page.lue | Accueil |
NOM | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
SYNOPSIS | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
#include <sys/mman.h> void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); int munmap(void *addr, size_t length);
DESCRIPTION | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
Si addr est NULL, le noyau choisit l'adresse à laquelle créer la projection ; c'est la méthode la plus portable pour créer une nouvelle projection. Si addr n'est pas NULL, le noyau considère comme un conseil l'endroit où placer la projection ; sous Linux, la projection sera créée à la prochaine plus haute frontière de page. L'adresse de la nouvelle projection est renvoyée comme résultat de l'appel.
Le contenu d'une projection de fichier (contrairement à une projection anonyme ; voir MAP_ANONYMOUS plus loin), est initialisé avec length octets démarrant au décalage offset dans le fichier (ou autre objet) référencé par le descripteur de fichiers fd. offset doit être un multiple de la taille de page telle qu'elle est renvoyée par sysconf(_SC_PAGE_SIZE).
L'argument prot indique la protection mémoire que l'on désire pour cette projection, et ne doit pas entrer en conflit avec le mode d'ouverture du fichier. Il s'agit soit de PROT_NONE (le contenu de la mémoire est inaccessible) soit d'un OU binaire entre les constantes suivantes :
Le paramètre flags si les mises à jour de la projection sont visibles par les autres processus projetant la même région et si les mises à jour sont reportées au fichier sous-jacent. Ce comportement est déterminé en incluant exactement une des valeurs suivantes dans flags :
Ces attributs sont décrits dans POSIX.1-2001.
De plus, zéro ou plus des valeurs suivantes peuvent être ajoutées dans flags avec un OU binaire :
Parmi les attributs précédents, seul MAP_FIXED est spécifié dans POSIX.1-2001. Toutefois, la plupart des systèmes prennent également en charge MAP_ANONYMOUS (ou son synonyme MAP_ANON).
Certains systèmes utilisent les attributs supplémentaires MAP_AUTOGROW, MAP_AUTORESRV, MAP_COPY et MAP_LOCAL.
La mémoire obtenue par mmap() est préservée lors d'un fork(2), avec les mêmes attributs.
La projection doit avoir une taille multiple de celle des pages. Pour un fichier dont la longueur n'est pas un multiple de la taille de page, la mémoire restante est remplie de zéros lors de la projection, et les écritures dans cette zone n'affectent pas le fichier. Les effets de la modification de la taille du fichier sous-jacent sur les pages correspondant aux zones ajoutées ou supprimées ne sont pas précisés.
munmap() | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
L'adresse addr doit être un multiple de la taille de page. Tous les pages contenant une partie de l'intervalle indiqué sont libérées, et tout accès ultérieur déclenchera SIGSEGV. Aucune erreur n'est détectée si l'intervalle indiqué ne contient pas de page projetée.
Modifications d'horodatage pour les projections supportées par un fichier | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
Les champs st_ctime et st_mtime pour un fichier projeté avec PROT_WRITE et MAP_SHARED seront mis à jour après une écriture dans la région projetée, et avant l'éventuel msync(3) suivant avec attribut MS_SYNC ou MS_ASYNC.
VALEUR RENVOYÉE | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
munmap() renvoie 0 s'il réussit. En cas d'échec, -1 est renvoyé et errno contient le code d'erreur (probablement EINVAL).
ERREURS | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
L'accès à une zone de projection peut déclencher les signaux suivants :
CONFORMITÉ | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
DISPONIBILITÉ | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
NOTES | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
Sur certaines architectures matérielles (par exemple, i386), PROT_WRITE implique PROT_READ. Cela dépend de l'architecture si PROT_READ implique PROT_EXEC ou non. Les programmes portables doivent toujours indiquer PROT_EXEC s'ils veulent exécuter du code dans la projection.
La manière portable de créer une projection est de spécifier addr à 0 (NULL), et d'omettre MAP_FIXED dans flags. Dans ce cas, le système choisit l'adresse de la projection ; l'adresse est choisie de manière à ne pas entrer en conflit avec une projection existante et de ne pas être nulle. Si l'attribut MAP_FIXED est indiqué et si addr est 0 (NULL), l'adresse projetée sera zéro (NULL).
BOGUES | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
Dans les noyaux antérieurs au 2.6.7, l'attribut MAP_POPULATE n'a d'effet que si prot a la valeur PROT_NONE.
SUSv3 spécifie que mmap() devrait échoué si length vaut 0. Toutefois, dans les noyaux précédents le 2.6.12, mmap() réussissait dans ce cas : aucun mappage n'était créé et l'appel renvoyait addr. Depuis le noyau 2.6.12, mmap() échoue avec l'erreur EINVAL dans ce cas.
EXEMPLE | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
Le programme suivant affiche sur la sortie standard une partie du fichier fourni en tant que premier argument de la ligne de commande. La plage d'octets à afficher est indiquée par les valeurs d'offset et de longueur fournies comme deuxième et troisième arguments de la ligne de commande. Le programme crée une projection mémoire des pages du fichier nécessaires et utilise write(2) pour écrire les octets souhaités.
#include <sys/mman.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(int argc, char *argv[]) { char *addr; int fd; struct stat sb; off_t offset, pa_offset; size_t length; ssize_t s; #define handle_error(msg) \ do { perror(msg); exit(EXIT_FAILURE); } while (0) if (argc < 3 || argc > 4) { fprintf(stderr, "%s file offset [length]\n", argv[0]); exit(EXIT_FAILURE); } fd = open(argv[1], O_RDONLY); if (fd == -1) handle_error("open"); if (fstat(fd, &sb) == -1) /* Pour obtenir la taille du fichier */ handle_error("fstat"); offset = atoi(argv[2]); pa_offset = offset & ~(sysconf(_SC_PAGE_SIZE) - 1); /* offset for mmap() must be page aligned */ if (offset >= sb.st_size) { fprintf(stderr, "offset is past end of file\n"); exit(EXIT_FAILURE); } if (argc == 4) { length = atoi(argv[3]); if (offset + length > sb.st_size) length = sb.st_size - offset; /* Can't display bytes past end of file */ } else { /* No length arg ==> display to end of file */ length = sb.st_size - offset; } addr = mmap(NULL, length + offset - pa_offset, PROT_READ, MAP_PRIVATE, fd, pa_offset); if (addr == MAP_FAILED) handle_error("mmap"); s = write(STDOUT_FILENO, addr + offset - pa_offset, length); if (s != length) { if (s == -1) handle_error("write"); fprintf(stderr, "partial write"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); } /* main */
VOIR AUSSI | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
TRADUCTION | Début | Précédent | Suivant | Sommaire | Préc.page.lue | Accueil |
Ce document est une traduction réalisée par Christophe Blaess <http://www.blaess.fr/christophe/> le 14 octobre 1996 et révisée le 6 juin 2008.
L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 2 mmap ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.
Sommaire | Début | Suivant | Sommaire | Préc.page.lue | Accueil |
Table des mots clés | Début | Suivant | Sommaire | Préc.page.lue | Accueil |
EACCES | ERREURS |
EAGAIN | ERREURS |
EBADF | ERREURS |
EINVAL | ERREURS |
ENFILE | ERREURS |
ENODEV | ERREURS |
ENOMEM | ERREURS |
EPERM | ERREURS |
ETXTBSY | ERREURS |
MAP_32BIT | DESCRIPTION |
MAP_ANON | DESCRIPTION |
MAP_ANONYMOUS | DESCRIPTION |
MAP_DENYWRITE | DESCRIPTION |
MAP_EXECUTABLE | DESCRIPTION |
MAP_FILE | DESCRIPTION |
MAP_FIXED | DESCRIPTION |
MAP_GROWSDOWN | DESCRIPTION |
MAP_LOCKED (depuis Linux 2.5.37) | DESCRIPTION |
MAP_NONBLOCK (depuis Linux 2.5.46) | DESCRIPTION |
MAP_NORESERVE | DESCRIPTION |
MAP_POPULATE (depuis Linux 2.5.46) | DESCRIPTION |
MAP_PRIVATE | DESCRIPTION |
MAP_SHARED | DESCRIPTION |
PROT_EXEC | DESCRIPTION |
PROT_NONE | DESCRIPTION |
PROT_READ | DESCRIPTION |
PROT_WRITE | DESCRIPTION |
SIGBUS | ERREURS |
SIGSEGV | ERREURS |