在应用程序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)中,我想访问这个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“
我看了一下unix.cpp的来源
我认为问题在于unix_key没有被设置,所以shmget在附件()中将失败。handle()是私有的,所以我不能调用这个函数来设置unix_key。
是否可以在不知道共享内存的大小/调用create()的情况下访问共享内存?
当我尝试调用create()时
QSharedMemory shmem(key);
shmem.create(SHM_DATASIZE);一个新的共享内存将创建..。
我做错了什么?提前谢谢。
发布于 2017-02-22 12:44:30
您不能访问同一个共享内存段。Qt修改传递它的键,结果是一个不同的键,因此共享内存id。
根据QSharedMemory文档
警告:QSharedMemory以特定于Qt的方式更改密钥,除非另有规定。与非Qt应用程序的互操作首先使用
QSharedMemory()创建默认共享内存,然后使用setNativeKey()设置本机密钥。当使用本机密钥时,共享内存不会受到多个访问的保护(例如,无法访问lock()),应该使用用户定义的机制来实现这种保护。
您似乎需要使用QSharedMemory创建共享内存段,使用setNativeKey()设置一个新键,然后从QSharedMemory外部附加到该内存。
https://stackoverflow.com/questions/42390672
复制相似问题