Boost.Interprocess — не удалось найти созданную managed_shared_memory

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

Я следовал инструкциям повысить документ lib

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

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 Система не может найти указанный файл

Если я сделаю

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

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

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

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

0

Решение

Вот решение:

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

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

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

прямо перед тем, как создать общую память.

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

0

Другие решения


По вопросам рекламы [email protected]