Programación en C

Cómo usar la función mmap en lenguaje C?

Cómo usar la función mmap en lenguaje C?
La mmap () La función se utiliza para mapear entre un espacio de direcciones de proceso y archivos o dispositivos. Cuando un archivo se asigna 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 la lectura y escritura de 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 * address, size_t length, int protect, int flags, int filedes,
off_t offset)

Argumentos:

La función toma 6 argumentos:

1. habla a:

Este argumento da una dirección de inicio preferida para el mapeo. Si no existe otro mapeo allí, entonces el kernel seleccionará un límite de página cercano y creará el mapeo; de lo contrario, el kernel elige una nueva dirección. Si este argumento es NULL, entonces el kernel puede colocar el mapeo en cualquier lugar que crea conveniente.

2. largo:

Este es el número de bytes que se mapearán.

3. proteger:

Este argumento se usa para controlar qué tipo de acceso está permitido. Este argumento puede ser un 'O' lógico 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 sobre el contenido.

4. banderas:

Este argumento se utiliza para controlar la naturaleza del mapa. A continuación se muestran algunos valores comunes de las banderas:

  • MAP_SHARED: Esta bandera se utiliza para compartir el mapeo con todos los demás procesos, que están mapeados 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 esta bandera, ningún otro proceso verá el mapeo y los cambios realizados no se escribirán en el archivo.
  • MAP_ANONYMOUS / MAP_ANON: Esta bandera se utiliza para crear un mapeo anónimo. El mapeo anónimo significa que el mapeo no está conectado a ningún archivo. Este mapeo se usa como la primitiva básica para extender el montón.
  • MAP_FIXED: Cuando se usa esta bandera, el sistema debe ser forzado a usar la dirección de mapeo exacta especificada en el habla a Si esto no es posible, el mapeo fallará.

5. filedes:

Este es el descriptor de archivo que debe mapearse.

6. compensar:

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

Valores devueltos:

En el éxito, el mmap () devuelve 0; en caso de falla, la función devuelve MAP_FAILED.

Gráficamente, podemos representar la función del mapa de la siguiente manera:

Para anular el mapeo de la región mapeada munmap () se utiliza la función:

Sintaxis:

int munmap(vacío *habla a, size_t largo);

Valores devueltos:

En el éxito, el munmap () devuelve 0; si falla, la función devuelve -1.

Ejemplos:

Ahora veremos un programa de ejemplo para cada uno de los siguientes usando la llamada al sistema mmap ():

  • Asignación de memoria (Ejemplo 1.C)
  • Leyendo archivo (Ejemplo2.C)
  • Archivo de escritura (Ejemplo3.C)
  • Comunicación entre procesos (ejemplo 4.C)

Ejemplo 1.C

#incluir
#incluir
int main ()
int N = 5; // Número de elementos para la matriz
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");
return 1;

// Rellena los elementos de la matriz
para (int i = 0; i ");
para (int i = 0; iprintf ("[% d]", ptr [i]);

printf ("\ n");
int err = munmap (ptr, 10 * tamaño de (int));
si (errar != 0)
printf ("Error al anular el mapeo \ n");
return 1;

return 0;

En Example1.c asignamos memoria usando mmap. Aquí usamos PROT_READ | Protección PROT_WRITE para lectura y escritura en la región mapeada. Usamos MAP_PRIVATE | Bandera MAP_ANONYMOUS. Se usa MAP_PRIVATE porque la región de mapeo no se comparte con otros procesos, y se usa MAP_ANONYMOUS porque aquí, no hemos mapeado ningún archivo. Por la misma razón, el descriptor de archivo y el compensar el valor se establece en 0.

Ejemplo 2.C

#incluir
#incluir
#incluir
#incluir
#incluir
#incluir
int main (int argc, char * argv [])
si (argc < 2)
printf ("Ruta de archivo no mencionada \ n");
salir (0);

const char * filepath = argv [1];
int fd = open (ruta de archivo, O_RDONLY);
si (fd < 0)
printf ("\ n \"% s \ ""no se pudo abrir \ n"",
ruta de archivo)
Cómo desarrollar un juego en Linux
Hace una década, no muchos usuarios de Linux predecían que su sistema operativo favorito algún día sería una plataforma de juegos popular para videoju...
Puertos de código abierto de motores de juegos comerciales
Las recreaciones gratuitas, de código abierto y de motores de juegos multiplataforma se pueden usar para jugar títulos de juegos antiguos y también al...
Los mejores juegos de línea de comandos para Linux
La línea de comandos no es solo su mayor aliado cuando usa Linux, también puede ser la fuente de entretenimiento porque puede usarla para jugar muchos...