mmap

mmap ("  Speicherzuordnung  ") ist ein UNIX -Systemaufruf ( POSIX- Standard ). Es erstellt eine Speicherprojektion von Dateien oder Peripheriegeräten .

mmap wird manchmal für die Kommunikation zwischen Prozessen verwendet . Für diese Funktionalität gibt es auch den shmem - Systemaufruf . Der Unterschied zwischen den beiden besteht darin, dass für mmap die Daten im Speicher nicht persistent sind.

Einige Systeme unterstützen eine erweiterte Version von mmap, mit der virtueller Speicher zugewiesen werden kann, ohne ihn mit einer Datei zu verknüpfen. mmap wird daher für die Speicherzuordnung verwendet .

die Einstellungen

Die Funktion benötigt sechs Argumente  :

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
  1. Startadresse im virtuellen Speicher.
  2. Größe der Projektion.
  3. Schutz ( PROT_EXEC, PROT_READ, PROT_WRITE, PROT_NONE).
  4. Flagge ( MAP_SHARED, MAP_PRIVATE, MAP_POPULATE...).
  5. Dateideskriptor.
  6. Position in dieser Datei.

Beispiel

#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); }

Anmerkungen und Referenzen

  1. (in) "  POSIX-Schnittstellenbibliothek: liboskit_posix.a  "
  2. http://manpagesfr.free.fr/man/man2/mmap.2.html

Siehe auch

Zum Thema passende Artikel

Externe Links