mmap

mmap ("  minnekart  ") er et UNIX- systemanrop ( POSIX- standard ). Den oppretter en minneprojeksjon av filer eller eksterne enheter .

mmap brukes noen ganger til kommunikasjon mellom prosesser . For denne funksjonaliteten er det også shmem- systemanropet . Forskjellen mellom de to er at for mmap er ikke dataene i minnet vedvarende.

Noen systemer støtter en utvidet versjon av mmap, som gjør det mulig å tildele virtuelt minne uten å koble det til en fil. mmap brukes derfor til minnetildeling .

Innstillinger

Funksjonen tar seks argumenter  :

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
  1. Startadresse i virtuelt minne.
  2. Projeksjonens størrelse.
  3. Beskyttelse ( PROT_EXEC, PROT_READ, PROT_WRITE, PROT_NONE).
  4. Flagg ( MAP_SHARED, MAP_PRIVATE, MAP_POPULATE...).
  5. Filbeskrivelse.
  6. Posisjon i denne filen.

Eksempel

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

Merknader og referanser

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

Se også

Relaterte artikler

Eksterne linker