La función mmap se utiliza a menudo en sistemas integrados. ¿Puede presentarnos su función?
Cómo utilizar la función mmap Programación de red UNIX Volumen 2 Comunicación entre procesos explica la función mmap. Esta función tiene tres propósitos principales:
1. Mapear un archivo normal en la memoria, que generalmente se usa cuando se requiere lectura y escritura frecuentes de archivos. De esta manera, la lectura y escritura en la memoria reemplaza la lectura de E/S. y escritura, para obtener un mayor rendimiento;
2. El mapeo de memoria anónimo de archivos especiales puede proporcionar espacio de memoria compartida para procesos asociados
3. generalmente asigna un archivo normal a la memoria.
Función: void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offsize);
Parámetro inicio: apunta al comienzo de la memoria); La dirección a asignar, generalmente configurada en NULL, significa que el sistema selecciona automáticamente la dirección y la devuelve después de que la asignación se realiza correctamente.
Longitud del parámetro: representa la cantidad del archivo que se asigna a la memoria.
Prot parámetro: el método de protección del área de mapeo. Puede ser una combinación de los siguientes métodos:
PROT_EXEC El área mapeada se puede ejecutar
PROT_READ El área mapeada se puede leer
PROT_WRITE El área mapeada se puede ser escrito
PROT_NONE No se puede acceder al área de mapeo
Marcas de parámetros: afecta varias características del área de mapeo. Se debe especificar MAP_SHARED o MAP_PRIVATE al llamar a mmap().
MAP_FIXED Si la dirección señalada por el parámetro inicio no se puede asignar correctamente, se abandonará la asignación y la dirección no se corregirá. En general, se desaconseja el uso de esta bandera.
Los datos escritos por MAP_SHARED en el área mapeada se copiarán nuevamente al archivo y se permitirá que otros procesos que mapeen el archivo los compartan.
MAP_PRIVATE La operación de escritura en el área mapeada producirá una copia del archivo mapeado, es decir, una "copia al escribir" privada (no se volverá a escribir ninguna modificación en esta área). el contenido del archivo original.
MAP_ANONYMOUS establece un mapeo anónimo. En este momento, se ignorará el parámetro fd, no habrá archivos involucrados y el área mapeada no se podrá compartir con otros procesos.
MAP_DENYWRITE solo permite operaciones de escritura en el área asignada y otras operaciones de escritura directa en el archivo serán rechazadas.
MAP_LOCKED bloquea el área mapeada, lo que significa que el área no se intercambiará.
Parámetro fd: el descriptor del archivo que se asignará a la memoria. Si se utiliza una asignación de memoria anónima, es decir, MAP_ANONYMOUS se establece en indicadores y fd se establece en -1. Algunos sistemas no admiten el mapeo de memoria anónimo. Puede usar fopen para abrir el archivo /dev/zero y luego mapear el archivo para lograr el mismo efecto del mapeo de memoria anónimo.
Desplazamiento del parámetro: el desplazamiento de la asignación del archivo, generalmente establecido en 0, lo que significa que la asignación comienza desde el frente del archivo. El desplazamiento debe ser un múltiplo entero del tamaño de paginación.
Valor de retorno:
Si la asignación se realiza correctamente, se devuelve la dirección inicial de memoria del área de asignación; de lo contrario, se devuelve MAP_FAILED(-1) y la causa del error se almacena en errno.
Código de error:
El parámetro EBADF fd no es un descriptor de archivo válido
El permiso de acceso a EACCES es incorrecto. Si es MAP_PRIVATE, el archivo debe ser legible. Si se utiliza MAP_SHARED, PROT_WRITE debe estar presente y el archivo debe poder escribirse.
Uno de los parámetros de inicio, longitud o desplazamiento de EINVAL es ilegal.
El archivo EAGAIN está bloqueado o hay demasiada memoria bloqueada.
ENOMEM Sin memoria.
La llamada al sistema mmap() se utiliza para compartir memoria de dos maneras:
(1) Utilice la asignación de memoria proporcionada por archivos normales:
Aplicable entre cualquier proceso. En este momento, debe abrir o crear un archivo y luego llamar a mmap()
El código de llamada típico es el siguiente:
fd=open(nombre, bandera, modo ); if(fdlt; 0) ...
ptr=mmap(NULL, len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0
Utilice mmap() para realizarlo); comunicación de memoria compartida Este método tiene muchas características y cosas a las que prestar atención. Puede consultar el Volumen 2 de Programación de red UNIX.
(2) Utilice archivos especiales para proporcionar mapeo de memoria anónimo:
Aplicable a procesos con afinidad. Debido a la afinidad especial entre los procesos padre e hijo, primero se llama a mmap () en el proceso padre y luego a fork (). Luego, después de llamar a fork (), el proceso hijo hereda el espacio de direcciones mapeado anónimamente del proceso padre y también hereda la dirección devuelta por mmap (). De esta manera, los procesos padre e hijo pueden comunicarse a través del área mapeada. Tenga en cuenta que esta no es una relación de herencia general. En términos generales, el proceso hijo mantiene de forma independiente algunas variables heredadas del proceso padre. La dirección devuelta por mmap() la mantienen conjuntamente los procesos padre e hijo. La mejor manera de lograr la máxima memoria compartida para procesos con afinidad debería ser utilizar un mapeo de memoria anónimo. En este punto, no es necesario especificar un archivo específico, simplemente configure el indicador apropiado.
Este artículo proviene del blog de CSDN. Indique la fuente al reimprimir: /scorpio16/archive/2008/01/22/2059623.aspx