Cómo usar la función MMAP en el lenguaje C?

Cómo usar la función MMAP en el lenguaje C?
El mmap () La función se utiliza para mapear entre un espacio de direcciones de proceso y archivos o dispositivos. Cuando se asigna un archivo a un espacio de direcciones de proceso, se puede acceder al archivo como una matriz en el programa. Esta es una de las formas más eficientes de acceder a los datos en el archivo y proporciona una interfaz de codificación perfecta que es natural para una estructura de datos que se puede evaluar sin la abstracción de leer y escribir desde archivos. En este artículo, vamos a discutir cómo usar el mmap () función en Linux. Entonces empecemos.

Archivo de cabecera:

#incluir

Sintaxis:

void * mmap (void * dirección, size_t longitud, int proteger, int flags, int archivado,
Off_t offset)

Argumentos:

La función toma 6 argumentos:

DIRECCIÓN:

Este argumento ofrece una dirección inicial preferida para el mapeo. Si no existe otro mapeo allí, entonces el núcleo elegirá un límite de página cercano y creará el mapeo; De lo contrario, el núcleo elige una nueva dirección. Si este argumento es nulo, entonces el núcleo puede colocar el mapeo en cualquier lugar donde considere adecuado.

longitud:

Este es el número de bytes que se mapearon.

proteger:

Este argumento se utiliza para controlar qué tipo de acceso está permitido. Este argumento puede ser lógico 'o' de las siguientes banderas Prot_read | Prot_write | Prot_Exec | Prot_none. Los tipos de acceso de lectura, escritura y ejecución son los permisos en el contenido.

banderas:

Este argumento se utiliza para controlar la naturaleza del mapa. Los siguientes son algunos valores comunes de las banderas:

  • Map_shared: Este indicador se utiliza para compartir el mapeo con todos los demás procesos, que se asignan a este objeto. Los cambios realizados en la región de mapeo se volverán a escribir en el archivo.
  • MAP_PRIVATE: Cuando se usa este indicador, la asignación no será vista por ningún otro proceso, y los cambios realizados no se escribirán en el archivo.
  • Map_anonymous / map_anon: Esta bandera se usa para crear un mapeo anónimo. Mapeo anónimo significa que la asignación no está conectada a ningún archivo. Este mapeo se usa como el primitivo básico para extender el montón.
  • MAP_FIXED: Cuando se usa este indicador, el sistema debe verse obligado a usar la dirección de mapeo exacta especificada en el DIRECCIÓN Si esto no es posible, entonces el mapeo será fallado.

Arranca:

Este es el descriptor de archivo que debe asignarse.

compensar:

Esto se compensa desde donde comenzó la asignación de archivos. En términos simples, el mapeo se conecta a (compensar) a (offset+longitud-1) bytes para el archivo abierto en archivado descriptor.

Valores de retorno:

Sobre el éxito, el mmap () devuelve 0; Para el fracaso, la función devuelve map_failed.

Potencialmente, podemos representar la función de mapa de la siguiente manera:

Para la UNMAP la región mapeada Munmap () Se utiliza la función:

Sintaxis:

int munmap(vacío *DIRECCIÓN, size_t longitud);

Valores de retorno:

Sobre el éxito, el Munmap () devuelve 0; Para el fracaso, la función devuelve -1.

Ejemplos:

Ahora veremos un programa de ejemplo para cada uno de los siguientes llamadas al sistema MMAP ():

  • Asignación de memoria (ejemplo1.C)
  • Archivo de lectura (ejemplo2.C)
  • Escribir archivo (ejemplo3.C)
  • Comunicación de interprocesos (Ejemplo4.C)

Ejemplo 1.C

#incluir
#incluir
int main ()
int n = 5;
int *ptr = mmap (null, n *sizeof (int),
Prot_read | Prot_Write, MAP_PRIVATE | Map_anonymous, 0, 0);
if (ptr == map_failed)
printf ("Mapeo fallido \ n");
regresar 1;

para (int i = 0; iptr [i] = i*10;
para (int i = 0; iprintf ("[%d]", ptr [i]);
printf ("\ n");
int err = munmap (ptr, 10*sizeof (int));
if (err != 0)
printf ("Unmapping fallido \ n");
regresar 1;

regresar 0;

En el ejemplo1.c asignamos memoria usando mmap. Aquí usamos prot_read | Prot_write Protection para leer y escribir en la región mapeada. Usamos el map_private | Map_anónimo de bandera. MAP_PRIVATE se usa porque la región de mapeo no se comparte con otros procesos, y MAP_Anonymous se usa porque aquí, no hemos asignado ningún archivo. Por la misma razón, el descriptor de archivo y el compensar el valor se establece en 0.

Ejemplo2.C

#incluir
#incluir
#incluir
#incluir
#incluir
#incluir
int main (int argc, char *argv [])
if (argc < 2)
printf ("ruta del archivo no mencionada \ n");
salida (0);

const char *filepath = argv [1];
int fd = open (filepath, o_rdonly);
Si (FD < 0)
printf ("\ n \"%s \ ""no pudo abrir \ n"",
ruta de archivo)