【发布时间】:2019-10-30 21:48:32
【问题描述】:
我无法在具有共享内存的进程之间共享指向对象的指针。
我可以成功地在不同进程之间共享如下结构:
// Data to be shared among processes
struct Shared_data {
int setPointCounter;
struct Point old_point;
pthread_mutex_t my_mutex;
} *shd;
该结构被声明为全局(假设它位于 main() 之前)。
我将共享内存初始化为main:
shd = (struct Shared_data *) (mmap(NULL, sizeof *shd, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0));
然后在某个时候我执行一个 fork()。它工作正常。
当我不得不分享这样的东西时,问题就出现了:
// Data to be shared among processes
struct Shared_data {
int setPointCounter;
struct Point old_point;
MyObject *obj;
pthread_mutex_t my_mutex;
} *shd;
我主要从第三方库调用一个函数,该函数返回一个指向 MyObject 类型对象的指针,我想以某种方式共享它。我该怎么做?
通过在网上搜索,我发现了一些与相对指针相关的东西,但我不确定它是否会起作用,同时我不知道如何正确地做到这一点。
我正在使用 Linux (Slackware 64 14.2),语言是 C/C++(实际上主要是 C)。
提前感谢您的宝贵时间。
【问题讨论】:
-
您需要将对象复制到共享内存中。指针指向非共享内存。
-
直接共享该对象的唯一方法是确保将其分配在共享的内存中。如果您无法更改库、为其提供存储空间或自己复制对象,则您只能进行诸如找出它使用的分配器并拦截之类的黑客攻击。
-
重点是我认为访问该对象的唯一方法是通过指针,因为我在 main() 中调用的函数属于另一个库并返回一个指针。
-
共享内存可以在不同的进程中挂载到不同的地址。您需要使用偏移量而不是指针值。 Boost 一个专门设计用于在共享内存中复制 STL 的库:进程间。寻找灵感。
-
我想我会改变方法来解决我的问题。谢谢大家的建议!
标签: c++ c pointers fork shared-memory