Увеличенное использование 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
).
Вопросы
- Можем ли мы использовать
boost::interprocess::managed_shared_memory
в C?? - Есть ли проблема реализации в разделе выше. (не может
Reader
доступ шм изWriter
через указатель) - Есть ли способ решить это ограничение 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