fork(),在C中共享内存和指针

fork(), shared memory and pointers in C

本文关键字:共享 内存 指针 fork      更新时间:2023-10-16

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

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

// 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));

然后在某一点上,我做了一个分叉((。它运行良好。

当我不得不分享这样的东西时,问题就出现了:

// 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)分配(,然后fork(2)是另一个进程。在那之前,所有的内存地址都指向相同的位置,如果我们考虑到这两个进程在分叉之前就已经存在,它们会做同样的事情,得到同样的结果,等等。

但是,一旦两个进程彼此分离,在一个进程中进行的所有分配可能会与在另一个进程中的相同分配定位不同,因为每个进程的不同历史记录可能会从任何分配器提供不同的结果。只要假设任务中的一些时间顺序和一些依赖时间的状态变化。。。之后,两个过程的状态将有所不同。

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

一旦进程转移,它们的虚拟空间就会存储不同的东西,而一个空间中的虚拟指针在另一个进程中是不可解释的。