所以我需要为Linux编写文件映射(Windows OpenFileMapping()
,MapViewOfFile()
等)。我为此选择了QSharedMemory
。
但我不确定如何让它与全局记忆一起工作。
是否有另一个正确的Linux文件映射anolog或QSharedMemory
的功能?
答案 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
,分别用于只写和读写映射。