QSharedMemory无法生成密钥

时间:2012-08-06 08:58:46

标签: shared-memory

我是Qt的新手,我想使用QSharedMemory作为工具在运行时连接一些应用程序。 我已经检查了QSharedMemory示例并提取了我需要使用它的所有内容。

这里的问题是QSharedMemory实例无法分配内存。 当我呼叫create()时,它返回false, 当我打印存储在errorString()中的错误消息时,它会显示以下错误:

QSharedMemory::create: unable to make key

我的代码与此类似:

QSharedMemory sharedmemory;
if(sharedmemory.isAttached())
    sharedmemory.detach();

QString st = "this is the shared data";
QBuffer buffer;
buffer.open(QBuffer::ReadWrite);
QDataStream out(&buffer);
out << st;
int size = buffer.size();

if(!sharedmemory.create(size))
{
    std::cout<<sharedmemory.errorString().toStdString()<<std::endl;
    return 1;
}

无论我将size作为create()方法提供给它,它都不会分配内存。

任何想法都是适当的。 谢谢 马赫迪

1 个答案:

答案 0 :(得分:1)

来自qsharedmemory_unix.cpp的源代码:

// build file if needed
int built = createUnixKeyFile(nativeKey);
if (built == -1) {
    errorString = QSharedMemory::tr("%1: unable to make key").arg(QLatin1String("QSharedMemory::create"));
    error = QSharedMemory::KeyError;
    return false;
}

来自QSharedMemory的Qt文档:

  

QSharedMemory::QSharedMemory ( const QString & key, QObject * parent = 0 )

     

使用给定父级构造共享内存对象,并将其键设置为key。由于其密钥已设置,因此可以调用其create()attach()函数。

     

另请参阅setKey()create()attach()

     
     

QSharedMemory::QSharedMemory ( QObject * parent = 0 )

     

此函数重载QSharedMemory()

     

使用给定父级构造共享内存对象。共享内存对象的密钥不是由构造函数设置的,因此共享内存对象没有附加的底层共享内存段。 setKey()create()可以使用之前,必须使用attach()设置密钥。

     

另见setKey()

(强调我的)

您基本上使用的是构造函数的第二种形式,而不是设置共享内存密钥。您应该为QSharedMemory提供一个关键名称 - 请咨询shm_open以获取有关此密钥的信息。请注意,在Linux中,POSIX共享内存是作为/dev/shm中的文件系统实现的,并且对密钥名称有一些限制 - 除了名称的开头之外,它不能包含正斜杠(/)。这样就需要在/dev/shm中创建目录,而shm_open()QSharedMemory::createUnixKeyFile()都不太愿意这样做。