Boost.Interprocess — созданная управляемая_общая_память не может быть найдена

Я собираюсь использовать общую память для межпроцессного взаимодействия (очевидно;) между расширением (компонентом) xulrunner и плагином (NPAPI). Оба написаны на C++!

Я следовал инструкциям увеличить документ библиотеки

Теперь: создание общей памяти работает нормально, выполнив следующее:

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) ;

Путь

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

показывает мне загадочный именованный файл во время выполнения процесса. При закрытии программы этот файл удаляется. Все идет нормально.

Я пытаюсь открыть эту общую память в другом процессе с помощью:

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

но затем выдает boost::interprocess::interprocess_exception Система не может найти указанный файл

If I do

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

Я получаю второй файл в пути пользователей в том же подкаталоге. Так почему же процесс-потребитель не может найти первый?

Кстати: если я пытаюсь открыть файл в пути с помощью текстового редактора (блокнот ++ и т. д.), он не может, потому что он утверждает, что файл не существует.

Спасибо за ваше время!!!


person dachiller    schedule 04.07.2014    source источник


Ответы (1)


Вот решение:

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

это исходный код из документации boost. В случае примера, который работал отлично. Но в моем случае (честно говоря, я не уверен, ПОЧЕМУ) я должен позвонить

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

прямо перед созданием общей памяти.

Вы не должны забыть сделать то же самое в своем деструкторе, чтобы удалить его!

person dachiller    schedule 09.07.2014