将现有的共享内存与qsharedMemory一起

Attach existing Shared Memory with QSharedMemory

本文关键字:qsharedMemory 一起 内存 共享      更新时间:2023-10-16

在应用程序1(c代码)IM创建类似的共享内存:

char * key_path = "/tmp/shmem";
int file = open(key_path, O_CREAT | O_RDWR | O_APPEND, 0755);
close(file);
key_t key = ftok(key_path, 1);
shmid = shmget (key, SHM_DATASIZE , IPC_CREAT | SHM_R | SHM_W);
shmdata = shmat(shmid, NULL, 0);shmid);

在应用程序2(QT)中,我想访问此共享模式

const char* native_key = "/tmp/shmem";
key_t ft_key = ftok(native_key, 1);
key = QString::number(ft_key);
QSharedMemory shmem(key);
if(!shmem.attach()) {
    qDebug() << "attach failed" << shmem.errorString()  << shmem.key() << shmem.nativeKey() << endl;
}

附加失败的" qsharedmemory :: atchect(shmget):不存在"。

所以我已经尝试了以下

const char* native_key = "/tmp/shmem";
key_t ft_key = ftok(native_key, 1);
key = QString::number(ft_key);
QSharedMemory shmem(key);
shmem.setNativeKey(native_key);
if(!shmem.attach()) {
    qDebug() << "attach failed" << shmem.errorString()  << shmem.key() << shmem.nativeKey() << endl;
}

附加失败的" qsharedmemory :: attecon(shmget):不存在"" "/tmp/shmem_prot"

我已经看了qsharedmemory_unix.cpp

的来源

我认为问题是未设置unix_key,因此()中的shmget将失败。handing()是私有的,所以我不能称此功能设置Unix_key。

是否可以访问共享内存而不知道IT的大小/调用Create()?

当我尝试调用create()

QSharedMemory shmem(key);
shmem.create(SHM_DATASIZE);

将创建一个新的共享内存...

我在做什么错?预先感谢。

您无法访问相同的共享内存段。QT修改了您传递的密钥,结果是另一个密钥,因此是共享的内存ID。

根据qsharedmemory文档:

警告:qsharedMemory以QT特定方式更改键,除非另有说明。与非QT应用程序的互操作是 通过首先创建默认共享内存来实现 QSharedMemory(),然后使用setNativeKey()设置本机键。 使用本机键时,共享内存不受保护 它上的多个访问(例如,无法lock())和一个 用户定义的机制应用于实现此类保护。

似乎您需要使用QSharedMemory创建共享内存段,使用setNativeKey()设置新键,然后从QSharedMemory的外部附加到该内存。