gpt4 book ai didi

c++ - 使用 QSharedMemory 附加现有的共享内存

转载 作者:太空宇宙 更新时间:2023-11-04 02:31:43 26 4
gpt4 key购买 nike

在应用程序 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;
}

attach failed "QSharedMemory::attach (shmget): doesn't exist" "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;
}

attach failed "QSharedMemory::attach (shmget): doesn't exist" "" "/tmp/shmem_prot"

我查看了 qsharedmemory_unix.cpp 的来源

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

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

当我尝试调用 create() 时

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

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

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

最佳答案

您没有访问同一个共享内存段。 Qt 修改您传递给它的 key ,结果是一个不同的 key ,因此是共享内存 ID。

Per the QSharedMemory documentation :

Warning: QSharedMemory changes the key in a Qt-specific way, unless otherwise specified. Interoperation with non-Qt applications is achieved by first creating a default shared memory with QSharedMemory() and then setting a native key with setNativeKey(). When using native keys, shared memory is not protected against multiple accesses on it (for example, unable to lock()) and a user-defined mechanism should be used to achieve such protection.

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

关于c++ - 使用 QSharedMemory 附加现有的共享内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42390672/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com