C++与Python共享内存连接:内存段名称传递问题求助
问题分析与解决方案
你的实现方式不兼容,原因在于:
- C++代码使用的是System V风格的共享内存(依赖
ftok、shmget、shmat等接口) - Python代码调用的
shared_memory模块属于POSIX标准的共享内存
这是两套完全独立的共享内存机制,无法直接互通,所以Python找不到名为"address"的内存段。
方案1:C++改用POSIX共享内存(与Python兼容)
修改C++代码使用POSIX共享内存接口,就能直接和Python的shared_memory模块交互:
#include <iostream> #include <fcntl.h> #include <sys/mman.h> #include <unistd.h> #include <cstring> int main() { const char* shm_name = "address"; const char* msg = "hello there"; int len = strlen(msg) + 1; const int shm_size = 20; // 创建/打开POSIX共享内存 int shm_fd = shm_open(shm_name, O_CREAT | O_RDWR, 0600); if (shm_fd == -1) { std::cout << "Failed: shm_open.\n"; return 1; } // 设置内存大小 if (ftruncate(shm_fd, shm_size) == -1) { std::cout << "Failed: ftruncate.\n"; return 1; } // 映射内存到进程地址空间 void* addr = mmap(NULL, shm_size, PROT_READ | PROT_WRITE, MAP_SHARED, shm_fd, 0); if (addr == MAP_FAILED) { std::cout << "Failed: mmap.\n"; return 1; } // 写入数据 memcpy(addr, msg, len); std::cout << "POSIX shared memory created successfully with name: " << shm_name << "\n"; getchar(); // 清理资源 munmap(addr, shm_size); close(shm_fd); shm_unlink(shm_name); // 程序退出后删除内存段,若需要持久化可注释此行 return 0; }
编译时需要链接rt库:g++ your_code.cpp -o shm_test -lrt
此时你的原Python代码就能正常读取了。
方案2:Python使用System V共享内存库读取
如果不想修改C++代码,Python可以用sysv_ipc库对接System V共享内存:
- 先安装库:
pip install sysv_ipc
- 编写Python代码:
import sysv_ipc # 和C++用相同的参数生成key key = sysv_ipc.ftok("address", 1) # 获取共享内存段 shm = sysv_ipc.SharedMemory(key, flags=0, size=20) # 读取数据 data = shm.read(11) print(data) # 释放资源 shm.detach()
这样就能读取C++程序创建的System V共享内存内容了。
内容的提问来源于stack exchange,提问作者kasra
相关产品推荐
相关产品推荐

