Я пытаюсь научиться распределять память между приложениями Qt и Non-Qt, имея доступ для чтения и записи от обоих. Сейчас я пытаюсь создать, а затем присоединить уже созданную память в Qt, используя собственный ключ. Хотя программа может успешно создать сегмент общей памяти, она не сможет получить к нему доступ при следующем запуске. Как я могу это исправить? Есть ли способ присоединить сегмент совместно используемой памяти, используя только собственный ключ?
#include <QCoreApplication>
#include <QDebug>
#include <QSharedMemory>
#include <sys/shm.h>
#include <errno.h>
#include <sys/types.h>
#include <unistd.h>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
qDebug() << "PID: " << getpid();
QSharedMemory *mem = new(QSharedMemory);
mem->setNativeKey("foobar");
if (!mem->create(3072, QSharedMemory::ReadWrite))
{
qDebug() << "Create fail:" << mem->errorString();
qDebug() << "trying to detach:" << mem->detach();
if (mem->attach())
{
qDebug() << "Attached succesfully";
}
else
{
qDebug() << "Attach fail:" << mem->errorString() << ", error:" << mem->error();
}
}
else
qDebug() << "Memory created successfully: ";
qDebug() << "nativeKey=" << mem->nativeKey() << ", key=" << mem->key();
qDebug() << "Waiting for input";
getchar();
// return a.exec();
return 0;
}
Первый запуск: работает должным образом, ключ сбрасывается при установке nativeKey.
PID: 10989
Memory created successfully:
nativeKey= "foobar" , key= ""
Waiting for input
Второй запуск: при попытке создания выдается ошибка, как и ожидалось, при попытке отсоединения также выдается ошибка, как и ожидалось (поскольку она не подключена), но при попытке подключить память возникает другая непредвиденная ошибка.
PID: 10992
Create fail: "QSharedMemory::create: already exists"
trying to detach: false
Attach fail: "QSharedMemoryPrivate::initKey: unable to set key on lock" , error: 3
nativeKey= "foobar" , key= ""
Ошибка 3 (изДокументация Qt):
The operation failed because of an invalid key.
Я не знаю, что не так с моим nativeKey.