Comunicación entre procesos y uso compartido de datos en Windows

  

Windows
Hay muchas formas de implementar la comunicación entre procesos, como el uso de sockets, tuberías, mailslots, etc. Pero el uso más básico y directo es compartir la memoria. Otros métodos eventualmente se desviarán aquí.

Es concebible que si solo hay una memoria física, esta memoria se puede asignar al respectivo espacio de direcciones virtuales en diferentes procesos, y cada proceso puede leer los mismos datos. El método más eficiente de intercambio de datos. Vamos a discutir cómo implementarlo.

La memoria compartida se implementa en Windows usando FileMapping. Podemos crear un objeto de asignación de archivos de memoria con CreateFileMapping. La API CreateFileMapping creará un objeto de kernel para asignar archivos a la memoria. Aquí, no necesitamos un archivo real, por lo que no necesitamos llamar a CreateFile para crear un archivo. El parámetro hFile se puede completar con INVALID_HANDLE_VALUE. Sin embargo, la longitud del archivo se debe rellenar. Windows es compatible con archivos de hasta 64 bits, pero en este caso, no necesitará más de 4G, dwMaximumSizeHigh debe ser 0, la longitud puede rellenar dwMaximumSizeLow. Luego llame a MapViewOfFile para asignar a la dirección virtual del proceso actual. Una vez que haya usado la memoria compartida, llame a UnmapViewOfFile para reclamar el espacio de direcciones de la memoria.

Windows separa las API CreateFileMapping y MapViewOfFile. Esto se debe a la asignación permite un archivo de más de 4G, pero 4G es sólo una cantidad máxima de direcciones (de hecho, el programa de usuario medio sólo se puede utilizar 2G), MapViewOfFile Offset puede especificar el archivo, pero sólo una parte de la asignación.

Rellena el último parámetro pszName CreateFileMapping un nombre, luego otro proceso puede utilizar este nombre para llamar OpenFileMapping para abrir este objeto filemapping para la cartografía en el nuevo proceso. Sin embargo, la forma de ponerse de acuerdo sobre las cadenas parece ser menos elegante.

Un método elegante es copiar objetos con filemapping DuplicateHandle en un nuevo proceso, y luego encontrar una forma de manejar notar nuevos procesos, como pasa en el pasado con la forma del mensaje.

Si los dos procesos que necesitan compartir memoria son las relaciones padre-hijo, podemos notificar a FileMapping Handle sin pasar ningún mensaje. El proceso principal puede pasar directamente el identificador del FileMapping al proceso secundario heredando el identificador. Por supuesto, debe establecer las propiedades que se pueden heredar al crear un CreateFileMapping.

se trata de:

SECURITY_ATTRIBUTES sa; sa.nLength = sizeof (sa); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; handle = CreateFileMapping (INVALID_HANDLE_VALUE, &sa, PAGE_READWRITE, 0, tamaño, NULL);

de este modo, cuando el CreateProcess, si el parámetro bInheritHandles a TRUE, puede haber heredará todas las propiedades de los objetos del núcleo se copian en el proceso hijo.

Nota: heredar objeto de núcleo es crear un proceso hijo en CreateProcess, pero no ha estado activo antes de que el hilo principal del proceso hijo, el núcleo analiza todos los objetos del núcleo en el proceso actual, echa un vistazo a la propiedad heredable de los que, a continuación, DuplicateHandle Hacer una copia al proceso hijo. Debido a que es un objeto de núcleo, sólo uno términos reales en el kernel, pero todo cuenta de referencia más uno, de los padres y los procesos secundarios para manejar el mismo objeto de núcleo debe ser el mismo.

El proceso de copia de objetos del kernel se realiza internamente mediante CreateProcess. Podemos pasar el objeto Handle (igual que el proceso hijo) al proceso hijo a través de la línea de comandos. Alternativamente, se puede pasar con variables de entorno.

Vale la pena señalar que después de que el proceso hijo se quede sin este objeto FileMapping, necesita CloseHandle menos el recuento de referencia.

Nota: Cuando se llama a CreateProcess, pszCommandLine no puede completar directamente una cadena no modificable. Por ejemplo:

CreateProcess (" quot;, test.exe y " " argumento prueba;, ...);

esto es un error, ya que " argumento prueba " se compilará compilador Ponlo en un segmento de datos no modificable. La forma correcta es:

Char línea_de_órdenes [] = " argumento prueba "; CreateProcess (" test.exe ", línea_de_órdenes, ...);

De este modo, el carácter de la línea de comandos La cadena se coloca en la pila y se puede leer y escribir.

El segundo a último parámetro de CreateProcess debe completar una estructura STARTUPINFOW. Esta estructura es muy complicada y por lo general requiere muchos problemas para completarse. Podemos copiar la estructura de un proceso padre y modificarlo según corresponda. Es:

STARTUPINFO si = {sizeof (SI)}; PROCESS_INFORMATION pi; GetStartupInfo (&SI); CreateProcess (..., &si, &pi);

Aquí, la primera información de longitud de la estructura STARTUPINFO se debe completar para garantizar la ejecución correcta de GetStartupInfo (&si);

Copyright © Conocimiento de Windows All Rights Reserved