我正在try 使用共享内存将C++程序连接到Python,但我不知道如何将内存段的名称传递给Python.

下面是我的C++代码:

key_t key = ftok("address", 1);
int shm_o;
char* msg = "hello there";
int len = strlen(msg) + 1;
void* addr;

shm_o = shmget(key, 20, IPC_CREAT | 0600);
if(shm_o == -1)
{
    std::cout << "Failed: shmget.\n";
    return 1;
}

addr = shmat(shm_o, NULL, 0);
if(addr == (void*) -1)
{
    std::cout << "Failed: shmat.\n";
    return 1;
}

std::cout << "Shared memory segment created successfully with id: " << shm_o;
memcpy(addr, msg, len);

getchar();
return 0;

我正在try 让python从共享内存段中读取数据,如下所示:

shm_a = shared_memory.SharedMemory(name="address", create=False, size=20)

print(bytes(shm_a.buf[:11]))

但它会抛出一个异常,说明没有名为‘Address’的文件或目录.

我这样做是正确的吗?或者有没有其他方法可以将Python附加到共享内存段?

任何帮助都将不胜感激.

推荐答案

冒昧地在这里发布一个POSIX共享内存段的工作示例,它将在类似Linux/Unix的系统上跨C/C++和Python工作.这个可以在Windows上运行not.

用于创建数据并将数据写入共享内存段的C++代码(命令行上提供的名称):

#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>

#include <iostream>
#include <string>

int main(int argc, char * argv[])
{
    if (argc != 2) {
         std::cerr << "Argument <shmem_name> required" << std::endl;
         return 1;
    }
    const char * shmem_name = argv[1];
    size_t shm_size = 4096;
    int shmem_fd = shm_open(shmem_name, O_CREAT|O_RDWR, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP);
    if (shmem_fd == -1) {
         perror("shm_open");
         return 1;
    }
    std::cout << "Shared Memory segment created with fd " << shmem_fd << std::endl;
    if (ftruncate(shmem_fd, shm_size) == -1) {
        perror("ftruncate");
        return 1;
    }
    std::cout << "Shared Memory segment resized to " << shm_size << std::endl;
    void * addr = mmap(0, shm_size, PROT_WRITE, MAP_SHARED, shmem_fd, 0);
    if (addr == MAP_FAILED) {
        perror("mmap");
        return 1;
    }
    std::cout << "Please enter some text to write to shared memory segment\n";
    std::string text;
    std::getline(std::cin, text);
    while (! text.empty()) {
        strncpy((char *)addr, text.data(), shm_size);
        std::cout << "Written '" << text << "' to shared memory segment\n";
        std::getline(std::cin, text);
    }
    std::cout << "Unlinking shared memory segment." << std::endl;
    shm_unlink(shmem_name) ;
}

从共享内存段的开头读取任何字符串的Python代码:

import sys
from multiprocessing import shared_memory, resource_tracker

if len(sys.argv) != 2:
    print("Argument <shmem_name> required")
    sys.exit(1)

shm_seg = shared_memory.SharedMemory(name=sys.argv[1])
print(bytes(shm_seg.buf).strip(b'\x00').decode('ascii'))
shm_seg.close()
# Manually remove segment from resource_tracker, otherwise shmem segment
# will be unlinked upon program exit
resource_tracker.unregister(shm_seg._name, "shared_memory")

Python相关问答推荐

判断两极中N(N 2)列水平是否相等

删除pandas rame时间序列列中未更改的值

"如果发生特定错误,返回值

指示组内的rejected_time是否在creation_timestamp后5分钟内

在for循环中仅执行一次此操作

使用GEKKO在简单DTE系统中进行一致初始化

如何使用scipy从频谱图中回归多个高斯峰?

Pydantic 2.7.0模型接受字符串日期时间或无

2维数组9x9,不使用numpy.数组(MutableSequence的子类)

即使在可见的情况下也不相互作用

点到面的Y距离

从numpy数组和参数创建收件箱

聚合具有重复元素的Python字典列表,并添加具有重复元素数量的新键

为什么默认情况下所有Python类都是可调用的?

numpy卷积与有效

启动带有参数的Python NTFS会导致文件路径混乱

旋转多边形而不改变内部空间关系

Python避免mypy在相互引用中从另一个类重定义类时失败

用SymPy在Python中求解指数函数

当条件满足时停止ODE集成?