You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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共享内存:

  1. 先安装库:
pip install sysv_ipc
  1. 编写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 05:55:18