"невозможно установить ключ на блокировку" при подключении памяти с собственным ключом в qt - PullRequest
0 голосов
/ 22 октября 2019

Я пытаюсь научиться распределять память между приложениями 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.

...