MMAP(2)

NOMBRE
mmap, munmap - ubica o elimina ficheros o dispositivos en memoria

SINTAXIS
#include <unistd.h>
#include <sys/mman.h>

#ifdef _POSIX_MAPPED_FILES

void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);

int munmap(void *start, size_t length);

#endif

DESCRIPCION
La funcion mmap intenta ubicar length bytes comenzando en el desplazamiento offset desde el fichero (u otro objeto) espeficicado por fd en memoria, preferiblemente en la direccion start. Esta ultima direccion es una sugerencia y normalmente se especifica como 0. El lugar donde es ubicado el objeto es devuelto por mmap. El argumento prot describes la proteccion de memoria deseada. Lo forman los siguientes bits

PROT_EXEC
    Las paginas deben ser ejecutadas.

PROT_READ
    Las paginas deben ser leidas.

PROT_WRITE
    Las paginas deben ser escritas.

PROT_NONE
    Las paginas no pueden ser accedidas.

El parametro flags especifica el tipo de objeto insertado, las opciones y modificaciones hechas a la copia insertada en memoria son privadas al proceso o son compartidas por otras referencias. Tiene los bits

MAP_FIXED
    No seleccionar una direccon diferente a la especificada. Si la direccion especificada no puede ser utilizada, mmap fallara. Si MAP_FIXED es especificado, start debe ser un multiplo del tamaqo de pagina. Utilizar esta opcion es desaconsejable.

MAP_SHARED
    Comparte este area con todos los otros objetos que seqalan a este objeto.

MAP_PRIVATE
    Crear un area privada "copy-on-write".

Debe especifirase extacamtente uno de los parametros MAP_SHARED o MAP_PRIVATE.

Los tres prametros anteriores estan descritos en POSIX.1b (formalmente POSIX.4). Linux tambien reconoce MAP_DENYWRITE, MAP_EXECUTABLE y MAP_ANON(YMOUS). La llamada al sistema munmap borra las ubicaciones para el rango de direcciones especificado, y causa referencias a las direcciones dentro del rango a fin de generar referencias a memoria inválidas.

VALOR DEVUELTO
Si ha funcionado mmap devuelve un puntero al area reservada. Caso de error, es devuelto el error MAP_FAILED (-1), y errno es modificado apropiadamente. Si ha funcionado munmap devuelve 0, si hay error -1, y errno es fijada (probablemente a EINVAL).

ERRORES

EBADF
    fd no es un descriptor de fichero valido (y MAP_ANONYMOUS no ha sido fijado).

EACCES
    MAP_PRIVATE fue indicado, pero fd no ha sido abierto para lectura. O MAP_SHARED fue invocado y PROT_WRITE fue fijado, y fd no esta abierto para escritura.

EINVAL
    No es correcto start o length o offset. (E.g., son demasiado grandes, o no estan alineados en los limites de un valor multiplo de PAGESIZE).

ETXTBUSY
    MAP_DENYWRITE fue fijado pero el objeto especificado por fd esta abierto para escritura.

EAGAIN
    El fichero ha sido bloqueado, o excesiva memoria ha sido bloqueada.

ENOMEM
    No hay memoria disponible.

COMPATIBLE CON
SVr4, POSIX.1b (formalmente POSIX.4), 4.4BSD. Svr4 documenta los codigos de error ENXIO y ENODEV.

VER TAMBIÉN
getpagesize(2), msync(2), shm_open(2), B.O. Gallmeister, POSIX.4, O'Reilly, pp. 128-129 and 389-391.