Pregunta

Tengo un proyecto que consta de dos procesos y necesito pasar algunos datos entre ellos de manera rápida y eficiente.

Soy consciente de que podría usar sockets para hacer esto usando TCP, aunque ambos procesos siempre existirán en la misma computadora, sin embargo, esta no parece ser una solución muy eficiente.

Veo mucha información sobre el uso de " tuberías " en Linux Sin embargo, principalmente quiero esto para Windows y Linux (preferiblemente a través de una biblioteca multiplataforma), idealmente en un tipo seguro, de manera no bloqueante.

Otra cosa importante es que necesito admitir varias instancias de toda la aplicación (es decir, ambos procesos), cada una con su propia copia independiente de los objetos de comunicación.

¿También hay una forma multiplataforma para generar un nuevo proceso?

¿Fue útil?

Solución

Para IPC, Windows admite tuberías con nombre al igual que Linux lo hace , excepto que los nombres de las tuberías siguen un formato diferente, debido a la diferencia en los formatos de ruta entre los dos sistemas operativos. Esto es algo que podría superar con simples definiciones de preprocesador. Ambos sistemas operativos también admiten IO sin bloqueo en tuberías y multiplexación de IO con select ().

Otros consejos

Eche un vistazo a Boost.Interprocess

  

Boost.Interprocess simplifica el uso de mecanismos comunes de comunicación y sincronización entre procesos y ofrece una amplia gama de ellos:

     
      
  • Memoria compartida.
  •   
  • Archivos mapeados en memoria.
  •   
  • Semáforos, mutexes, variables de condición y tipos de mutex actualizables para colocarlos en la memoria compartida y en los archivos mapeados de memoria.
  •   
  • Versiones con nombre de esos objetos de sincronización, similares a UNIX / Windows sem_open / CreateSemaphore API.
  •   
  • Bloqueo de archivos.
  •   
  • Punteros relativos.
  •   
  • Colas de mensajes.
  •   
     

Boost.Interprocess también ofrece mecanismos de interproceso de nivel superior para asignar dinámicamente partes de una memoria compartida o un archivo mapeado de memoria (en general, para asignar partes de un segmento de memoria de tamaño fijo). Con estos mecanismos, Boost.Interprocess ofrece herramientas útiles para construir objetos C ++, incluidos contenedores similares a STL, en la memoria compartida y en los archivos de memoria asignados:

     
      
  • Creación dinámica de objetos anónimos y con nombre en una memoria compartida o archivo mapeado de memoria.
  •   
  • Contenedores tipo STL compatibles con memoria compartida / archivos mapeados en memoria.
  •   
  • asignadores tipo STL listos para memoria compartida / archivos mapeados en memoria que implementan varios patrones de asignación de memoria (como agrupación).
  •   
     

Boost.Interprocess se ha probado en los siguientes compiladores / plataformas:

     
      
  • Visual 7.1 Windows XP
  •   
  • Visual 8.0 Windows XP
  •   
  • GCC 4.1.1 MinGW
  •   
  • GCC 3.4.4 Cygwin
  •   
  • Intel 9.1 Windows XP
  •   
  • GCC 4.1.2 Linux
  •   
  • GCC 3.4.3 Solaris 11
  •   
  • GCC 4.0 MacOs 10.4.1
  •   

El TCP antiguo simple debería funcionar de manera bastante eficiente; Según tengo entendido, los sistemas operativos modernos detectarán cuándo ambos extremos de una conexión TCP se encuentran en la misma máquina y enrutarán internamente esos datos a través de un mecanismo rápido y liviano (similar a una tubería) en lugar de a través de la pila TCP ordinaria.

Entonces, si ya tiene un código que funciona a través de TCP, le digo que se quede con eso y evite gastar mucho tiempo de desarrollo adicional por poco beneficio.

Puede ser excesivo, pero podría usar el Apache Portable Runtime; aquí son las funciones de hilo y proceso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top