fork(),C 中的共享内存和指针
fork(), shared memory and pointers in C
我无法在具有共享内存的进程之间共享指向对象的指针。
我可以在不同进程之间成功共享如下所示的结构:
// 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;
主要是我从第三方库中调用了一个函数,该函数 returns 是一个指向 MyObject 类型对象的指针,我想以某种方式共享它。我该怎么做?
通过在网上搜索,我发现了一些与相对指针相关的东西,但我不确定它是否会起作用,同时,我也不知道如何以正确的方式去做。
我正在研究 Linux (Slackware 64 14.2),语言是 C/C++(实际上主要是 C)。
提前感谢您的宝贵时间。
指针基本上是一个进程的虚拟 space 中一些数据的地址。你不能在进程之间共享指针,因为那些指针将在不同的地址space中被解释(一般来说,这也适用于内核模式虚拟space和用户模式相同 进程)。让我们举个例子……你做了一些分配(在它们之间你做了一个 mmap(2)
分配)然后你 fork(2)
另一个进程。在那之前,如果我们认为两个进程在 fork 之前就已经存在,那么所有内存地址都指向相同的位置,它们会做同样的事情,得到相同的结果,等等。
但是一旦两个进程彼此分离,在一个进程中进行的所有分配可能与在另一个进程中进行的相同分配处于不同的位置,因为每个进程的不同历史process 可以提供来自任何分配器的不同结果。假设任务中有一些时间顺序和一些时间相关的状态变化......之后,两个进程的状态将不同。
现在假设您在一个进程中有一个指针,它指向您想要与其他进程共享的数据结构。但是另一个进程甚至没有分配同样的东西......所以通过例如0x00456211ff
到另一个进程将指向另一个进程中未分配任何内容的位置(导致 SIGSEGV
信号和进程中止)
一旦进程转移它们的虚拟 space 存储不同的东西,一个 space 中的虚拟指针在另一个进程中是不可解释的。
我无法在具有共享内存的进程之间共享指向对象的指针。
我可以在不同进程之间成功共享如下所示的结构:
// 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;
主要是我从第三方库中调用了一个函数,该函数 returns 是一个指向 MyObject 类型对象的指针,我想以某种方式共享它。我该怎么做?
通过在网上搜索,我发现了一些与相对指针相关的东西,但我不确定它是否会起作用,同时,我也不知道如何以正确的方式去做。
我正在研究 Linux (Slackware 64 14.2),语言是 C/C++(实际上主要是 C)。
提前感谢您的宝贵时间。
指针基本上是一个进程的虚拟 space 中一些数据的地址。你不能在进程之间共享指针,因为那些指针将在不同的地址space中被解释(一般来说,这也适用于内核模式虚拟space和用户模式相同 进程)。让我们举个例子……你做了一些分配(在它们之间你做了一个 mmap(2)
分配)然后你 fork(2)
另一个进程。在那之前,如果我们认为两个进程在 fork 之前就已经存在,那么所有内存地址都指向相同的位置,它们会做同样的事情,得到相同的结果,等等。
但是一旦两个进程彼此分离,在一个进程中进行的所有分配可能与在另一个进程中进行的相同分配处于不同的位置,因为每个进程的不同历史process 可以提供来自任何分配器的不同结果。假设任务中有一些时间顺序和一些时间相关的状态变化......之后,两个进程的状态将不同。
现在假设您在一个进程中有一个指针,它指向您想要与其他进程共享的数据结构。但是另一个进程甚至没有分配同样的东西......所以通过例如0x00456211ff
到另一个进程将指向另一个进程中未分配任何内容的位置(导致 SIGSEGV
信号和进程中止)
一旦进程转移它们的虚拟 space 存储不同的东西,一个 space 中的虚拟指针在另一个进程中是不可解释的。