Pregunta

Nunca antes había escrito ningún IPC C ++ en Linux.

Mi problema es que tendré varios clientes (escritores) y un solo servidor (lector). Todo esto estará en la misma máquina. Los escritores entregarán fragmentos de datos (una cadena / estructura) al lector. El lector los leerá en FIFO y hará algo con ellos.

Los tipos de IPC en Linux son Pipes o Sockets / Message Queues por lo que puedo decir.

Me preguntaba si alguien podría recomendarme un camino a seguir. Me estoy inclinando hacia los enchufes, pero no tengo una base real para eso. ¿Hay algo que debería leer / comprender antes de embarcarme en este viaje?

Gracias

¿Fue útil?

Solución

El problema principal que debe considerar es qué tipo de datos está pasando, ya que esto determinará en parte sus opciones. Esto se reduce a si sus datos están limitados o no. Si no está limitado, entonces algo apropiado orientado a la secuencia como FIFOs o sockets es apropiado; si es así, podría hacer un mejor uso de cosas como MQ o memoria compartida. Dado que menciona cadenas y estructuras, es difícil decir qué es apropiado en su caso, aunque si sus cadenas están limitadas dentro de un máximo razonable, puede usar cualquier cosa con algunos pequeños violines.

El segundo es la velocidad. Nunca hay una respuesta completamente correcta para esto, pero generalmente es algo así como: memoria compartida, MQ, FiFO, sockets de dominio, sockets de red.

El tercero es la facilidad de uso. La memoria compartida es la PITA más grande ya que debe manejar su propia sincronización. Las canalizaciones son fáciles siempre que la longitud de su mensaje permanezca por debajo del tamaño de PIPE_BUF. El sistema operativo maneja la mayoría de sus dolores de cabeza con MQ. Los enchufes son bastante fáciles, pero tiene la configuración estándar.

Por último, varios de los mecanismos de IPC tienen variantes POSIX y SYSV. En general, POSIX es el camino a seguir a menos que el tipo SYSV tenga alguna característica que realmente necesite o desee.

EDITAR: la respuesta de Count0 me recordó que podría estar interesado en algo más abstracto y de mayor nivel. Además de ACE, puede consultar Poco . Y, por supuesto, ninguna respuesta SO está completa si no menciona Impulsar en alguna parte.

Otros consejos

System V IPC es algo complicado de usar, pero es una tecnología sólida y madura. Las colas de mensajes probablemente harían lo que quisieras y admitirían la cola / eliminación de cola atómica.

Los sockets son fáciles de usar y también admiten la comunicación a través de una red. Sin embargo, no hacen ninguna cola, por lo que tendría que escribir el código de gestión de colas dentro de su servidor. Usar sockets con C ++ no es muy diferente a usarlos con C. Hay muchas guías para esto en la red y libros como Stevens '' Unix Network Programming (vol 1) 'que cubren este tema con cierta profundidad.

Un buen lugar para mojarse los pies es este tutorial de enchufes .

Luego, deberá deshuesarse en hilos y amp; mutexes y aquí .

Con lo anterior, ya está todo listo para comenzar a jugar ;-)

Aunque no ha pedido libros, y debido a que las respuestas anteriores son muy buenas, solo voy a sugerirle que tenga en sus manos copias de estos dos tomos:

Programación de redes UNIX, Volumen 2, Segunda edición: Comunicaciones entre procesos, W. Richard Stevens

Programación avanzada en el entorno UNIX, segunda edición, W. Richard Stevens y Stephen A. Rago

Hay ins inevitables & amp; con este tipo de codificación, estos dos libros lo ayudarán a superar cualquier confusión que encuentre.

Intente echar un vistazo a ACE (Entorno de comunicación adaptable) . Las bibliotecas ACE son gratuitas, muy maduras y multiplataforma. Lamentablemente, una buena documentación no lo es, recomendaría este libro para buscar un buena solución. Puede intentar echar un vistazo a este tutorial para obtener una idea de los patrones (al final del documento). ACE usa un montón de patrones para tratar con éxito y eficiencia esos problemas, especialmente en un contexto de red, por lo que debería ser un buen comienzo para buscar buenos patrones y métodos para usar.

Especialmente Ace_Task usando Message_Queue permite hacer lo que necesita.

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