1

在应用程序 1(C 代码)中,我创建了一个这样的共享内存:

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)中,我想访问这个 SharedMemory

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::attach (shmget): 不存在”“16858191”“/tmp/qipc_sharedmemory_24384b85e5d54b23bd4f84f14de71b10d4801666”

所以我尝试了以下

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::attach (shmget): 不存在”“”“/tmp/shmem_prot”

我查看了qsharedmemory_unix.cpp的来源

我认为问题在于 unix_key 未设置,因此 attach() 中的 shmget 将失败。handle() 是私有的,所以我不能调用这个函数来设置 unix_key。

是否可以在不知道共享内存大小/调用 create() 的情况下访问共享内存?

当我尝试调用 create()

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

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

我究竟做错了什么?提前致谢。

4

1 回答 1

2

您没有访问相同的共享内存段。Qt 修改了你传递给它的密钥,结果是一个不同的密钥,因此共享内存 id。

根据 QSharedMemory 文档

警告:除非另有说明,否则 QSharedMemory 以特定于 Qt 的方式更改密钥。与非 Qt 应用程序的互操作是通过首先使用创建默认共享内存, QSharedMemory()然后使用 设置本机密钥来实现的setNativeKey()。使用本机密钥时,共享内存不受对其进行多次访问的保护(例如,无法lock()),应使用用户定义的机制来实现这种保护。

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

于 2017-02-22T12:44:30.593 回答