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