Solución:
Quizás shmget
y shmat
no son necesariamente las interfaces más adecuadas para su uso. En un proyecto en el que trabajo, proporcionamos acceso a un demonio a través de una API de C y Python usando memoria asignada archivos, lo que nos brinda una forma muy rápida de acceder a los datos
El orden de las operaciones es algo así:
- el cliente hace un
door_call()
para decirle al demonio que cree una región de memoria compartida - el demonio crea de forma segura un archivo temporal
- el demonio
open()
sy luegommap()
s ese archivo - el demonio devuelve el descriptor de archivo al cliente a través de
door_return()
- el cliente
mmap()
s el descriptor de archivo y asocia variables colocadas consecutivamente en una estructura con ese fd - el cliente realiza las operaciones que necesita en esas variables, cuando es necesario.
- el demonio lee de la región compartida y hace sus propias actualizaciones (en nuestro caso, escribe valores de esa región compartida en un archivo de registro).
Nuestros clientes hacen uso de una biblioteca para manejar los primeros 5 pasos anteriores; la biblioteca viene con envoltorios de Python que usan ctypes para exponer exactamente qué funciones y tipos de datos se necesitan.
Para su espacio problemático, si es solo la aplicación Python la que escribe en su cola de salida, entonces puede rastrear qué marcos se han procesado solo en la aplicación Python. Si tanto sus aplicaciones python como c ++ están escribiendo en la cola de salida, eso aumenta su nivel de dificultad y quizás refactorizar la arquitectura general de la aplicación sería una buena inversión.