c++ - 共享内存进程间通信

标签 c++ c memory-management ipc

我使用 shmget 分配了一 block 共享内存.

然后我使用 shmat 将共享内存分别附加到进程 A 和进程 B .我假设 shmat 返回的 A 和 B 的句柄(即 A 和 B 中映射到实际共享内存的地址)是不同的。

假设 A 和 B 的句柄定义为 char* pchar* q分别。 我的问题是我们是否将对象写入地址 p + sizeof(anotherObject)在进程 A 中,我们能否期望在地址 q + sizeof(anotherObject) 处获得相同的对象?在进程 B 内?

我猜是这样,但不是 100% 确定。如果是这样,那么这种通信或映射机制是如何实现的,因为我们知道 p + sizeof(anotherObject)q + sizeof(anotherObject)指的是不同的内存位置?

最佳答案

现代处理器使用虚拟地址空间。您在程序中使用的地址不是对象的“真实”地址,操作系统和处理器将内存页面映射到地址范围,您将其用作“内存”。

创建共享内存只是意味着操作系统将同一内存页映射到两个或多个不同进程的地址空间。两个进程中的两个指针不具有相同的数值这事实没有任何意义,即使不同进程中的指针具有相同的数值,它们通常指向不同的内存位置。

关于将“对象”写入内存,首先要对其进行“序列化”。我提到过不同进程中的指针是相互不兼容的。如果你的对象有任何指针成员,或者其他可能包含指针的对象,你必须想办法用实际数据替换那些指针,因为一旦你从另一个线程读取对象,那些指针就和垃圾。

请注意,C++ std::sting、std::vector 和其他容器,以及任何虚拟对象(具有虚函数的对象)内部都有指针。所以如果你想传递一个字符串,你需要将它作为一个字符序列写入共享内存,并在另一端以相同的方式读取。

关于c++ - 共享内存进程间通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8314428/

相关文章:

c++ - 神秘的 C++ 声明

c - 如何遍历给定的整数输入,并给出从最大到最小数字的输出?

memory-management - 动态堆分配困惑

c++ - 2个不同的数组,一个分配

c++ - 我怎样才能避免这种代码重复?

c++ - 2D 群组碰撞检测

c++ - CString 内的内存访问冲突

c - 对于任何类型的文件,哪种数据类型在计算 CRC16 时更好

c - 在头部被删除并重新创建后创建列表的第二个元素时出错

c# - 我的 CPU 支持多少内存?