C++ fork()、C中的共享内存和指针

C++ fork()、C中的共享内存和指针,c++,c,pointers,fork,shared-memory,C++,C,Pointers,Fork,Shared Memory,我无法在具有共享内存的进程之间共享指向对象的指针 我可以在不同进程之间成功共享如下结构: // Data to be shared among processes struct Shared_data { int setPointCounter; struct Point old_point; pthread_mutex_t my_mutex; } *shd; 结构声明为全局结构(比如说,它位于main()之前) 我将共享

我无法在具有共享内存的进程之间共享指向对象的指针

我可以在不同进程之间成功共享如下结构:

    // Data to be shared among processes
    struct Shared_data {
        int setPointCounter;
        struct Point old_point;
        pthread_mutex_t my_mutex;
    } *shd;
结构声明为全局结构(比如说,它位于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)


提前感谢您的时间。

指针基本上是一个进程虚拟空间中某些数据的地址。不能在进程之间共享指针,因为这些指针将在不同的地址空间中解释(通常,这也适用于同一进程的内核模式虚拟空间和用户模式)。让我们举个例子。。。您进行了一些分配(在它们之间进行了
mmap(2)
allocation),然后您进行了
fork(2)
另一个过程。在此之前,所有的内存地址指向相同的地方,如果我们认为这两个进程都存在于叉之前,他们将一直在做同样的操作,得到相同的结果,等等。 但是,一旦两个进程彼此分离,在一个进程中进行的所有分配可能会与在另一个进程中进行的相同分配处于不同的位置,因为每个进程的不同历史记录可能会提供来自任何分配器的不同结果。只需假设任务中的一些时间顺序和一些依赖于时间的状态更改。。。之后,两个过程的状态将不同

现在让我们假设您在一个进程中有一个指针,它指向您想要与另一个进程共享的数据结构。但另一个进程甚至没有分配相同的东西。。。因此,将例如
0x00456211ff
传递到另一进程将指向另一进程中未分配任何内容的位置(导致
SIGSEGV
信号和进程中止)


一旦进程转移其虚拟空间存储不同的内容,并且一个空间中的虚拟指针在另一个进程中不可解释。

您需要将对象复制到共享内存中。指针指向非共享内存。直接共享该对象的唯一方法是确保在共享内存中分配该对象。如果您不能更改库、为库提供存储或自己复制对象,那么您只能进行黑客攻击,比如找出它使用的分配器并拦截它。问题是,我认为访问该对象的唯一方法是通过指针,因为我在main()中调用的函数属于另一个库并返回指针。共享内存可以在不同的进程中装入到不同的地址。您需要使用偏移量而不是指针值。Boost是一个专门为在共享内存中复制STL而设计的库:进程间。我想我会改变方法来解决我的问题。谢谢大家的建议!非常感谢路易斯,超级详尽的解释!不客气。。。如果你对答案感到满意,你应该选择你喜欢的答案。