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((之前(。
我将共享内存初始化为主内存:
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
信号和进程中止(
一旦进程转移,它们的虚拟空间就会存储不同的东西,而一个空间中的虚拟指针在另一个进程中是不可解释的。
- 使用Boost Interprocess创建托管共享内存需要很长时间
- 字符串共享内存映射的向量
- CUDA 使用共享内存平铺 3D 卷积实现
- 共享内存:MapViewOfFile 返回错误 5
- 如何在多写入器情况下对文件支持的共享内存中的大页面出错
- 有没有办法列出所有共享内存对象的名称?
- 共享内存的升压容器是否实现锁定?
- 共享内存中的健壮互斥锁不是那么健壮
- 使用IPC/共享内存将Integer数组从C++传递到Python
- 共享内存和性能
- 在这种特殊情况下,我是否需要在共享内存中使用原子类型
- 是否可以在专用内存空间中分配一个为提升管理共享内存而创建的对象
- fork(),在C中共享内存和指针
- 访问共享内存而不使用易失性、std::atomic、信号量、互斥锁和自旋锁
- 提升进程间共享内存open_or_create每次都会引发异常
- 通过 mmap-ed 共享内存传递可变长度 C 字符串
- 越界访问 CUDA 共享内存
- 在共享内存中插入映射映射时出现编译器错误
- 矩阵矢量产品 CUDA 通过平铺和共享内存提高性能
- 如何更改在 c++ 中使用提升库创建的共享内存的路径