Red de conocimiento informático - Conocimiento informático - ¿Qué función puede utilizar el sistema integrado para obtener los números de identificación de los procesos padre e hijo?

¿Qué función puede utilizar el sistema integrado para obtener los números de identificación de los procesos padre e hijo?

Cómo utilizar la función mmap: Programación de redes 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 frecuente de archivos, de modo que la lectura y escritura en la memoria reemplace la lectura y escritura de E/S para obtener un mayor rendimiento; El mapeo de memoria anónimo de archivos especiales puede proporcionar espacio de memoria compartida para procesos asociados. 3. Proporcionar espacio de memoria compartida para procesos no asociados, generalmente mapeando un archivo normal en la memoria. Función: void*mmap(void*start, size_tlength, intprot, intflags, intfd, off_toffsize inicio del parámetro: apunta a la dirección inicial de la memoria a mapear, generalmente configurada en NULL, lo que significa que el sistema selecciona automáticamente la dirección). y regresa después de que la asignación sea exitosa. Longitud del parámetro: representa la cantidad del archivo que se asigna a la memoria. Protección de parámetros: método de protección del área de mapeo. Puede ser una combinación de los siguientes métodos: se puede ejecutar el área mapeada PROT_EXEC, se puede leer el área mapeada PROT_READ, se puede escribir el área mapeada PROT_WRITE, no se puede acceder al área mapeada PROT_NONE Indicadores de parámetros: afecta varias características del área mapeada. Se debe especificar MAP_SHARED o MAP_PRIVATE al llamar a mmap(). MAP_FIXED Si la dirección a la que apunta 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 asignada se copiarán nuevamente en el archivo y se permitirá que otros procesos que mapeen el archivo los compartan. La operación de escritura de MAP_PRIVATE en el área mapeada producirá una copia del archivo mapeado, es decir, una "copia al escribir" privada (copyonwrite). Cualquier modificación en esta área no reescribirá 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 se rechazarán otras operaciones de escritura directa en el archivo. MAP_LOCKED bloquea el área mapeada, lo que significa que el área no será reemplazada (intercambiada). Parámetro fd: el descriptor de 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 corresponde 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 no tiene memoria. La llamada al sistema mmap() se utiliza para compartir memoria de dos formas: (1) Utilice la asignación de memoria proporcionada por archivos normales: adecuada para 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(name, flag, mode) if (fdlt; 0)ptr=mmap(NULL); , len, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); El método de comunicación para realizar memoria compartida a través de mmap () tiene muchas características y cosas a las que prestar atención. Puede consultar el segundo volumen de Programación de redes UNIX. (2) Utilice archivos especiales para proporcionar un mapeo de memoria anónimo: adecuado para procesos con relaciones relacionadas. 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: 2059623.aspx

.