首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用QSharedMemory附加现有共享内存

用QSharedMemory附加现有共享内存
EN

Stack Overflow用户
提问于 2017-02-22 11:54:15
回答 1查看 2.6K关注 0票数 1

在应用程序1(C代码)中,im创建了如下所示的共享内存:

代码语言:javascript
复制
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

代码语言:javascript
复制
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”

所以我尝试了以下几种方法

代码语言:javascript
复制
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“

我看了一下unix.cpp的来源

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

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

当我尝试调用create()时

代码语言:javascript
复制
QSharedMemory shmem(key);
shmem.create(SHM_DATASIZE);

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

我做错了什么?提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-22 12:44:30

您不能访问同一个共享内存段。Qt修改传递它的键,结果是一个不同的键,因此共享内存id。

根据QSharedMemory文档

警告:QSharedMemory以特定于Qt的方式更改密钥,除非另有规定。与非Qt应用程序的互操作首先使用QSharedMemory()创建默认共享内存,然后使用setNativeKey()设置本机密钥。当使用本机密钥时,共享内存不会受到多个访问的保护(例如,无法访问lock()),应该使用用户定义的机制来实现这种保护。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42390672

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档