多进程通过共享内存访问类指针的代码
时间: 2023-10-05 09:09:57 浏览: 38
好的,以下是一个使用共享内存访问类指针的多进程代码示例:
```c++
#include <iostream>
#include <cstring>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
class MyClass {
public:
void print() {
std::cout << "Hello from MyClass!" << std::endl;
}
};
int main() {
const int SHM_SIZE = sizeof(MyClass);
const char* SHM_NAME = "MySharedMemory";
// 创建共享内存
int shmid = shmget(IPC_PRIVATE, SHM_SIZE, IPC_CREAT | 0666);
if (shmid < 0) {
std::cerr << "Failed to create shared memory!" << std::endl;
return 1;
}
// 将共享内存映射到进程地址空间
void* shm_ptr = shmat(shmid, nullptr, 0);
if (shm_ptr == reinterpret_cast<void*>(-1)) {
std::cerr << "Failed to attach shared memory!" << std::endl;
return 1;
}
// 在共享内存中创建 MyClass 对象
MyClass* my_class_ptr = new (shm_ptr) MyClass();
// 创建子进程
pid_t pid = fork();
if (pid < 0) {
std::cerr << "Failed to fork!" << std::endl;
return 1;
}
else if (pid == 0) {
// 子进程中访问 MyClass 对象
MyClass* ptr = static_cast<MyClass*>(shmat(shmid, nullptr, 0));
if (ptr == reinterpret_cast<MyClass*>(-1)) {
std::cerr << "Failed to attach shared memory!" << std::endl;
return 1;
}
ptr->print();
shmdt(ptr);
return 0;
}
else {
// 父进程中等待子进程结束并清除共享内存
wait(nullptr);
my_class_ptr->~MyClass(); // 显式调用析构函数
shmdt(shm_ptr);
shmctl(shmid, IPC_RMID, nullptr);
return 0;
}
}
```
这个示例代码中,首先创建了一个 `MyClass` 类型的共享内存,并且在共享内存中创建了一个 `MyClass` 对象。然后,fork 出一个子进程,在子进程中访问了共享内存中的 `MyClass` 对象,最后在父进程中等待子进程结束并清除共享内存。需要注意的是,在父进程中需要显式调用 `MyClass` 对象的析构函数。
这里使用了一个技巧:在共享内存中创建对象。这可以确保父子进程都访问同一个对象,而不是创建两个对象(这可能导致数据不一致)。此外,还需要注意显式调用析构函数,以避免内存泄漏。