首页 > 解决方案 > 在qt中使用本机键附加内存时“无法设置键锁定”

问题描述

我正在尝试学习如何在 Qt 和非 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 出了什么问题。

标签: c++qtsysvqsharedmemory

解决方案


推荐阅读