Cómo implementa MFC la comunicación entre procesos
2.1 Asignación de archivos
La asignación de archivos (archivos asignados en memoria) permite que el proceso trate el contenido del archivo como una parte de la memoria en el rango de direcciones del proceso. Por lo tanto, el proceso no tiene que utilizar operaciones de E/S de archivos y puede leer y modificar el contenido del archivo con operaciones de puntero simples.
La API Win32 permite que múltiples procesos accedan al mismo objeto de mapeo de archivos, y cada proceso recibe un puntero de memoria en su propio espacio de direcciones. Al utilizar estos punteros, diferentes procesos pueden leer o modificar el contenido del archivo, logrando compartir completamente los datos del archivo.
Las aplicaciones tienen tres métodos para permitir que múltiples procesos compartan un objeto de mapeo de archivos.
(1) Herencia: el primer proceso crea un objeto de mapeo de archivos y sus procesos secundarios heredan el identificador del objeto.
(2) Mapeo de archivos con nombre: cuando el primer proceso crea un objeto de mapeo de archivos, puede especificar un nombre para el objeto (que puede ser diferente del nombre del archivo). Un segundo proceso puede abrir este objeto de asignación de archivos con este nombre. Además, el primer proceso también puede pasar el nombre al segundo proceso a través de algún otro mecanismo IPC (canalización con nombre, ranura de correo, etc.).
(3) Copia del identificador: el primer proceso crea un objeto de mapeo de archivos y luego pasa el identificador del objeto al segundo proceso a través de otros mecanismos IPC (canalizaciones con nombre, ranuras de correo, etc.). El segundo proceso copia el identificador y obtiene acceso al objeto de asignación de archivos.
El mapeo de archivos es una forma muy efectiva de compartir datos entre múltiples procesos y tiene mayor seguridad. Sin embargo, la asignación de archivos solo se puede usar entre procesos en la máquina local y no se puede usar en la red, y los desarrolladores también deben controlar la sincronización entre procesos.
2.2 Memoria compartida
La memoria compartida en la API de Win32 es en realidad un caso especial de mapeo de archivos. Cuando el proceso crea un objeto de asignación de archivos, utiliza 0xFFFFFFFF en lugar del identificador de archivo (HANDLE), lo que significa que el objeto de asignación de archivos correspondiente accede a la memoria desde el archivo de página del sistema operativo y otros procesos pueden abrir el objeto de asignación de archivos. este bloque de memoria. Dado que la memoria compartida se implementa mediante el mapeo de archivos
, también tiene mejor seguridad y solo puede ejecutarse entre procesos en la misma computadora.
2.3 Tubería anónima
Una tubería (Pipe) es un canal de comunicación con dos puntos finales: un proceso con un identificador en un extremo puede comunicarse con un proceso con un identificador en el otro extremo . Las tuberías pueden ser unidireccionales (un extremo es de solo lectura y el otro extremo es de solo escritura) o pueden ser bidireccionales (ambos extremos de la tubería son legibles y grabables);
Una tubería anónima es una tubería unidireccional sin nombre que transmite datos entre un proceso padre y un proceso hijo, o entre dos procesos hijos del mismo proceso padre. Por lo general, el proceso principal crea un canal y luego el proceso secundario para comunicarse hereda el identificador del punto final de lectura o el identificador del punto final de escritura del canal y luego implementa la comunicación. El proceso principal también puede crear dos o más procesos secundarios que heredan identificadores de lectura y escritura de canalización anónima. Estos procesos secundarios
pueden comunicarse directamente mediante canalizaciones, sin pasar por el proceso principal.
Las canalizaciones anónimas son un método eficaz para implementar la redirección de E/S estándar de procesos secundarios en una sola máquina. No se pueden utilizar en línea ni entre dos procesos no relacionados.
2.4 Canalizaciones con nombre
Una canalización con nombre (Named Pipe) es una canalización unidireccional o bidireccional para la comunicación entre un proceso de servidor y uno o más procesos de cliente. A diferencia de las canalizaciones anónimas, las canalizaciones con nombre se pueden utilizar entre procesos no relacionados y diferentes computadoras. Cuando el servidor crea una canalización con nombre, le asigna un nombre y cualquier proceso puede abrirla a través de este nombre. el proceso del servidor de acuerdo con los permisos otorgados.
Las canalizaciones con nombre proporcionan una interfaz de programación relativamente simple, lo que hace que la transmisión de datos a través de la red no sea más difícil que la comunicación entre dos procesos en la misma computadora. Sin embargo, no es capaz si desea comunicarse con múltiples procesos al mismo tiempo. al mismo tiempo.
2.5 Ranuras de correo
Las ranuras de correo proporcionan capacidades de comunicación unidireccional entre procesos. Cualquier proceso puede crear una ranura de correo y convertirse en un servidor de ranura de correo. Otros procesos, llamados clientes de ranura de correo, pueden enviar mensajes al proceso del servidor de ranura de correo utilizando el nombre de la ranura de correo. Los mensajes entrantes se colocan en la ranura de correo hasta que el proceso del servidor los lee. Un proceso puede ser un servidor de ranura de correo o un cliente de ranura de correo, por lo que se pueden establecer múltiples ranuras de correo para lograr una comunicación bidireccional entre procesos.
Puede utilizar la ranura de correo para enviar mensajes a las ranuras de correo de la computadora local, a las ranuras de correo de otras computadoras o a las ranuras de correo con el mismo nombre en todas las computadoras en un área de red específica. La longitud del mensaje de la comunicación de difusión no puede exceder los 400 bytes y la longitud de los mensajes que no son de difusión está limitada por la longitud máxima del mensaje especificada por el servidor de ranura de correo.
La ranura de correo es similar a una canalización con nombre, pero transmite datos a través de datagramas no confiables (como paquetes UDP en el protocolo TCP/IP). Una vez que ocurre un error de red, no hay garantía de que se envíe el mensaje. se recibirá correctamente y
La transmisión de datos de canalización con nombre se basa en conexiones confiables. Sin embargo, las ranuras de correo tienen una interfaz de programación simplificada y la capacidad de transmitir mensajes a todas las computadoras en un área de red específica, por lo que las ranuras de correo son otra opción para que las aplicaciones envíen y reciban mensajes.
2.6 Portapapeles
El Portapapeles (tablero recortado) es esencialmente un conjunto de funciones y mensajes que se utilizan para transmitir datos en la API de Win32, que proporciona un intercambio de datos entre aplicaciones de Windows. intermediario, y el mecanismo de cortar (copiar) y pegar establecido por Windows proporciona un acceso directo para compartir datos en diferentes formatos entre diferentes aplicaciones. Cuando un usuario realiza una operación de cortar o copiar en una aplicación, la aplicación debe
colocar los datos seleccionados en el portapapeles en uno o más formatos. Cualquier otra aplicación puede entonces tomar los datos del portapapeles y elegir su propio formato entre los formatos dados.
El portapapeles
es un medio de intercambio muy flexible que puede admitir cualquier formato de datos. Cada formato se identifica mediante un número entero sin signo. Para los formatos de portapapeles estándar (predefinidos), este valor es un. constante definida por la API de Win32 para formatos no estándar, puede usar la función Registrar formato del portapapeles para registrarse como un nuevo formato del portapapeles. Los datos intercambiados utilizando el portapapeles solo deben ser consistentes en el formato de datos o pueden convertirse a un formato determinado. Pero el portapapeles sólo se puede utilizar en programas basados en Windows, no en la web.
2.7 Intercambio dinámico de datos
El intercambio dinámico de datos (DDE) es una forma de comunicación entre procesos que utiliza memoria compartida para intercambiar datos entre aplicaciones. Las aplicaciones pueden usar DDE para transferencias de datos únicas o para intercambiar datos dinámicamente entre aplicaciones enviando valores actualizados a medida que hay nuevos datos disponibles.
DDE, al igual que el portapapeles, admite formatos de datos estándar (como texto, mapas de bits, etc.) y formatos de datos autodefinidos. Pero sus mecanismos de transmisión de datos son diferentes. Una diferencia obvia es que las operaciones del portapapeles casi siempre se utilizan como una respuesta única a operaciones especificadas por el usuario, como seleccionar el comando Pegar del menú. Aunque el usuario también puede iniciar DDE, generalmente continúa funcionando sin intervención adicional del usuario. DDE tiene tres métodos de intercambio de datos:
(1) Cadena de frío: el intercambio de datos es una transmisión de datos única, al igual que el portapapeles.
(2) Enlace cálido: el servidor notifica al cliente cuando se intercambian datos y luego el cliente debe solicitar nuevos datos.
(3) Enlace activo: el servidor envía datos automáticamente al cliente cuando se intercambian datos.
Los intercambios DDE pueden ocurrir entre aplicaciones en una sola máquina o en diferentes computadoras en una red. Los desarrolladores también pueden definir formatos de datos DDE personalizados para IPC con fines especiales entre aplicaciones que tienen requisitos de comunicación más estrechamente acoplados. La mayoría de las aplicaciones basadas en Windows admiten DDE.
2.8 Vinculación e incrustación de objetos
Las aplicaciones utilizan la tecnología de vinculación e incrustación de objetos (OLE) para administrar documentos compuestos (documentos compuestos de múltiples formatos de datos que OLE proporciona a una aplicación un servicio que). facilita llamar a otras aplicaciones para editar datos
. Por ejemplo, los procesadores de texto compatibles con OLE pueden anidar hojas de cálculo y la biblioteca OLE puede iniciar automáticamente un editor de hojas de cálculo cuando un usuario desea editar una hoja de cálculo. Cuando el usuario sale del editor de hojas de cálculo, la tabla se ha actualizado en el documento original del procesador de textos. Aquí el editor de hojas de cálculo se convierte en una extensión del procesador de textos y, si usa DDE, el usuario debe iniciar explícitamente el editor de hojas de cálculo.
Al igual que la tecnología DDE, la mayoría de las aplicaciones basadas en Windows admiten la tecnología OLE.
2.9 Biblioteca de vínculos dinámicos
Los datos globales en la biblioteca de vínculos dinámicos (DLL) de Win32 pueden ser compartidos por todos los procesos que llaman a la DLL, lo que abre una nueva forma de comunicación entre procesos. Por supuesto, debes prestar atención a los problemas de sincronización al acceder.
Aunque los datos entre procesos se pueden compartir a través de DLL, desde la perspectiva de la seguridad de los datos, no recomendamos este método y utilizamos el método de compartir memoria con control de permisos de acceso.
2.10 Llamada a procedimiento remoto
La llamada a procedimiento remoto (RPC) proporcionada por la API de Win32 permite que las aplicaciones utilicen funciones de llamada remota, lo que hace que la comunicación de procesos mediante RPC en la red sea como funciones Es tan sencillo como llamar. RPC se puede utilizar entre diferentes procesos en una sola máquina o en una red.
Porque el RPC proporcionado por la API de Win32 cumple con el estándar OSF-
DCE (Open Software Foundation Distributed Computing Environment). Por lo tanto, las aplicaciones RPC escritas a través de la API Win32 pueden comunicarse con aplicaciones RPC que admiten DEC en otros sistemas operativos. Con el uso de RPC, los desarrolladores pueden crear aplicaciones distribuidas estrechamente acopladas y de alto rendimiento.
2.11 Función NetBios
La API Win32 proporciona funciones NetBios para manejar el control de red de bajo nivel. Esto es principalmente para escribir la interfaz con Windows para el sistema IBM NetBios. A menos que esas aplicaciones tengan requisitos especiales de funcionalidad de red de bajo nivel, es mejor no utilizar funciones NetBios para la comunicación entre procesos.
2.12 Sockets
La especificación Windows Sockets es un conjunto de programación de red bajo Windows definido en base a la popular interfaz Socket en BSD UNIX en la Universidad U.C. de Berkeley.
interfaz. Además de las funciones de biblioteca originales de Berkeley Socket, también se ha ampliado un conjunto de funciones para Windows, lo que permite a los programadores hacer un uso completo del sistema de máquina de mensajes de Windows
para programar.
Hoy en día, cada vez más aplicaciones de red implementan la comunicación de procesos a través de Sockets. La razón principal es que la naturaleza multiplataforma de Sockets es mucho mejor que otros mecanismos de IPC. WinSock 2.0 no sólo admite el protocolo TCP/IP, sino que también admite otros protocolos (como IPX).
La única desventaja de Sockets es que admite operaciones de comunicación subyacentes, lo que hace que la transferencia de datos simple entre procesos en una sola máquina sea inconveniente. En este caso, sería más apropiado utilizar el mensaje WM_COPYDATA que se presenta a continuación.
2.13 Mensaje WM_COPYDATA
WM_COPYDATA es un mensaje muy poderoso pero poco conocido. Cuando una aplicación transmite datos a otra aplicación, el remitente solo necesita llamar a la función SendMessage. Los parámetros son el identificador de la ventana de destino, la dirección inicial de los datos transferidos y el mensaje WM_COPYDATA. El receptor solo necesita procesar el mensaje WM_COPY DATA como otros mensajes, para que tanto el remitente como el receptor puedan compartir datos.
WM_COPYDATA es un método muy simple, que en realidad se implementa mediante el mapeo de archivos en el nivel inferior. Su desventaja es que su flexibilidad no es alta y solo se puede utilizar en un entorno independiente en la plataforma Windows.