Увеличенное использование managed_shared_memory между двумя процессами (C и C++)

У меня возникла проблема проектирования / реализации с Boost managed_shared_memory,

проблема

У меня есть два процесса: Writer а также Reader,

  • Вот Writer исполняемый файл C++, использующий boost для записи в общую память Снимок кода для метода записи:

    shm_controller.reset(new boost::interprocess::managed_shared_memory( boost::interprocess::open_or_create, shmName, size));
    void * addr = shm_controller->allocate(size) ;
    shm_controller->deallocate(addr);
    

    Как только у меня есть указатель адреса, я использую memcpy написать в шм.

  • С другой стороны, у меня Reader, который является C исполняемым. Они оба общаются через приложение для передачи сообщений. я написал Reader код таким образом:

    • Writer передает адрес, который хранится в "addr" (сверху снимок кода) Reader,
    • однажды Reader получить адрес и размер, я использую memcpy записывать данные SHM из Readerлокальная переменная

Примечание 1: (Это Reader не использует API Boost Shm, так как это приложение C)
Примечание 2: я подтвердил адрес совпадает на Writer а также Reader (после общения).

Но Reader"s memcpy читать данные shm приводит к сбою в моем исполняемом файле (Reader).


Вопросы

  1. Можем ли мы использовать boost::interprocess::managed_shared_memory в C??
  2. Есть ли проблема реализации в разделе выше. (не может Reader доступ шм из Writer через указатель)
  3. Есть ли способ решить это ограничение C и C++, как любая реализация оболочки и т. Д.

1 ответ

Решение

В. Можем ли мы использовать boost::interprocess::managed_shared_memory в C??

Нет. Технически, конечно, вы можете (C завершается), но это не поддерживается.

Q. Есть ли проблемы с реализацией в разделе выше. (не может читатель получить доступ к ШМ писателя через указатель)

Да, вы не можете с пользой передавать указатель от одного процесса другому, потому что они имеют изолированное адресное пространство.

В. Есть ли способ решить это ограничение C и C++, как любая реализация оболочки и т. Д.

Обычный подход заключается в передаче данных между процессами как части сообщения. Используйте свою библиотеку для передачи сообщений ( http://man7.org/linux/man-pages/man7/mq_overview.7.html, http://zeromq.org/ и т. Д.).

Примечание. Это также позволяет избежать проблем с синхронизацией доступа к общей памяти, о которых вы даже не говорили. Это дает мне идею, что вы не думали об этом

Следующая лучшая идея - использовать сырой shm API с обеих сторон и передавать смещение в область разделяемой памяти между процессами. Вы все еще можете использовать BIP, если вы ограничиваете себя, например, shared_memory_object и, например, offset_ptr

Другие вопросы по тегам