Mmap

mmap (« memory map ») est un appel système UNIX (norme POSIX[1]). Il établit une projection en mémoire des fichiers ou périphériques.

mmap est parfois utilisé pour la communication inter-processus. Pour cette fonctionnalité, il existe aussi l'appel système shmem. La différence entre les deux est que pour mmap, les données en mémoire ne sont pas persistantes.

Certains systèmes supportent une version étendue de mmap, qui permet d'allouer de la mémoire virtuelle sans la lier à un fichier. mmap est donc utilisé pour l'allocation de mémoire.

Paramètres

La fonction prend six arguments[2] :

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
  1. Adresse de départ en mémoire virtuelle.
  2. Taille de la projection.
  3. Protection (PROT_EXEC, PROT_READ, PROT_WRITE, PROT_NONE).
  4. Drapeau (MAP_SHARED, MAP_PRIVATE, MAP_POPULATE...).
  5. Descripteur de fichier.
  6. Position dans ce fichier.

Exemple

#include <sys/types.h>
#include <sys/mman.h>
#include <err.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(void)
{
        const char str1[] = "string 1";
        const char str2[] = "string 2";
        int parpid = getpid(), childpid;
        int fd = -1;
        char *anon, *zero;

        if ((fd = open("/dev/zero", O_RDWR, 0)) == -1)
                err(1, "open");

        anon = (char*)mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_ANON|MAP_SHARED, -1, 0);
        zero = (char*)mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_FILE|MAP_SHARED, fd, 0);

        if (anon == MAP_FAILED || zero == MAP_FAILED)
                errx(1, "either mmap");

        strcpy(anon, str1);
        strcpy(zero, str1);

        printf("PID %d:\tanonymous %s, zero-backed %s\n", parpid, anon, zero);
        switch ((childpid = fork())) {
        case -1:
                err(1, "fork");
                /* NOTREACHED */

        case 0:
                childpid = getpid();
                printf("PID %d:\tanonymous %s, zero-backed %s\n", childpid, anon, zero);
                sleep(3);

                printf("PID %d:\tanonymous %s, zero-backed %s\n", childpid, anon, zero);
                munmap(anon, 4096);
                munmap(zero, 4096);
                close(fd);
                return (EXIT_SUCCESS);
        }

        sleep(2);
        strcpy(anon, str2);
        strcpy(zero, str2);

        printf("PID %d:\tanonymous %s, zero-backed %s\n", parpid, anon, zero);
        munmap(anon, 4096);
        munmap(zero, 4096);
        close(fd);
        return (EXIT_SUCCESS);
}

Notes et références

  1. (en) « POSIX Interface Library: liboskit_posix.a »
  2. « MMAP », sur manpagesfr.free.fr (consulté le ).

Voir aussi

Articles connexes

  • malloc : allocation de mémoire

Liens externes

  • Le manuel de l'appel système "mmap"
v · m
Programme informatique
Compilation
Exécution
  • Configuration
  • Interprète
  • Machine virtuelle
  • Offset
  • Portabilité
  • Processus
  • Point d'arrêt
  • Thread
  • Segmentation
Bug
  • Catégorie
    • Compilateur
    • Bug
v · m
Méthodes
Protocoles
  • icône décorative Portail de l’informatique
  • icône décorative Portail de la programmation informatique