Qt Linux文件映射全局内存

时间:2016-01-15 08:40:12

标签: c++ linux qt shared-memory

所以我需要为Linux编写文件映射(Windows OpenFileMapping()MapViewOfFile()等)。我为此选择了QSharedMemory。 但我不确定如何让它与全局记忆一起工作。

是否有另一个正确的Linux文件映射anolog或QSharedMemory的功能?

2 个答案:

答案 0 :(得分:4)

QSharedMemory用于在进程之间创建共享内存,而不是用于映射文件的内存。 (参见官方Qt example)。

对于内存映射文件,您只需在QFile上使用.map()函数,例如

QFile file("MyFile");
if (!file.open(QIODevice::ReadWrite)) {
     //handle error
}
uchar *memory = file.map(0, file.size());
if (memory) {
    //mapped ok, use memory here

    file.unmap();
} else {
   //handle error
}

.map()函数继承自QFileDevice。默认情况下,映射在其他进程之间共享,您可以使用QFileDevice::MapPrivateOption创建专用映射,其中映射内存的更改不与其他进程(或磁盘文件)共享。

答案 1 :(得分:1)

0.0.0.0更适合附加到SysV共享内存对象。听起来你正在寻找更多关于内存映射文件的C ++包装器(根据你引用的函数的名称判断 - 我不知道任何Windows API)。

过去我使用QSharedMemory取得了成功(对于文件的只读映射):

boost::iostreams::mapped_file_source

同一命名空间中还有// compiled, but not actually tested! #include <boost/iostreams/device/mapped_file.hpp> #include <QByteArray> #include <QDebug> #include <QString> void useMappedFile(QString filename) { boost::iostreams::mapped_file_source file(filename.toStdString()); if (!file.is_open()) { qWarning() << "Failed to open file"; return; } auto bytes = QByteArray::fromRawData(file.data(), file.size()); someFunction(bytes); // do not allow 'file' to go out of scope before 'bytes', as it owns the // storage! Read the description of 'QByteArray::fromRawData'. } mapped_file_sink,分别用于只写和读写映射。