2014-07-04 1 views
0

Je suis sur le point d'utiliser la mémoire partagée pour la communication interprocessus (évidemment;) entre une extension xulrunner (composant) et un plugin (NPAPI). Les deux sont écrits en C++!Boost.Interprocess - créé managed_shared_memory est introuvable

je suivais les instructions du boost lib document

maintenant: La création de la mémoire partagée fonctionne bien en faisant ceci:

struct shm_remove 
    { 
     shm_remove() { NS_BI::shared_memory_object::remove("MySharedMemory"); } 
     ~shm_remove() { NS_BI::shared_memory_object::remove("MySharedMemory"); } 
    } remover; 


    _myShMemSegment = NS_BI::managed_shared_memory(NS_BI::open_or_create, "MySharedMemory", 65536) ; 
    SHMEM_ALLOCATOR alloc_inst(_myShMemSegment.get_segment_manager()) ; 

    _pMyShMemMap = _myShMemSegment.construct<SHMEM_MAP>("cgfMap") 
                 (std::less<int>() 
                 , alloc_inst) ; 

Le chemin

C:\Users\All Users\boost_interprocess\<aNumber>\ 

me montre une fichier nommé cryptique, pendant le processus est en cours d'exécution. En fermant le programme, ce fichier est supprimé. Jusqu'ici tout va bien.

je tente d'ouvrir cette mémoire partagée dans un autre processus avec:

NS_BI::managed_shared_memory(NS_BI::open_read_only, "MySharedMemory") ; 

, mais il lance le boost :: :: interprocessus interprocess_exception système ne peut pas trouver le fichier spécifié

Si je fais

NS_BI::managed_shared_memory(NS_BI::open_or_create, "MySharedMemory", 1024) ; 

Je reçois un deuxième fichier dans le chemin Utilisateurs dans le même sous-répertoire. Alors, pourquoi le premier ne pouvait-il pas être trouvé par le processus de consommation? Btw: Si j'essaie d'ouvrir le fichier dans le chemin avec un texteditor (notepad ++, etc), il ne pourrait pas parce qu'il affirme que le fichier n'existe pas.

Merci pour votre temps !!!

Répondre

0

Voici la solution:

struct shm_remove 
{ 
    shm_remove() { NS_BI::shared_memory_object::remove("MySharedMemory"); } 
    ~shm_remove() { NS_BI::shared_memory_object::remove("MySharedMemory"); } 
} remover; 

est le code d'origine de la documentation de boost. Dans le cas de l'exemple qui a bien fonctionné. Mais dans mon cas (pour être honnête, je ne sais pas pourquoi), je dois appeler

NS_BI::shared_memory_object::remove("MySharedMemory"); 

juste avant de construire la mémoire partagée.

Vous ne devriez pas oublier de faire de même dans votre destructeur pour le supprimer!

Questions connexes