mmap
mmap (" mapa de memoria ") es una llamada al sistema UNIX ( estándar POSIX ). Establece una proyecciónde memoria de archivos o periféricos .
mmap se utiliza a veces para la comunicación entre procesos . Para esta funcionalidad, también existe la llamada al sistema shmem . La diferencia entre los dos es que para mmap , los datos en la memoria no son persistentes.
Algunos sistemas admiten una versión extendida de mmap, que permite asignar memoria virtual sin vincularla a un archivo. Por tanto, mmap se utiliza para la asignación de memoria .
configuraciones
La función toma seis argumentos :
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
- Dirección de inicio en memoria virtual.
- Tamaño de la proyección.
- Protección ( PROT_EXEC, PROT_READ, PROT_WRITE, PROT_NONE).
- Bandera ( MAP_SHARED, MAP_PRIVATE, MAP_POPULATE...).
- Descriptor de archivo.
- Posición en este archivo.
Ejemplo
#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);
}
Notas y referencias
-
(en) " Biblioteca de interfaz POSIX: liboskit_posix.a "
-
http://manpagesfr.free.fr/man/man2/mmap.2.html
Ver también
Artículos relacionados
-
malloc : asignación de memoria
enlaces externos