我对内存映射非常陌生,正在尝试理解内存映射文件以在我的项目(基于Linux)中使用它们。 我的要求是从内存映射文件中写入并读取数据。 我编写了一个示例程序,只进行了写入操作,并且它可以正常工作,但是我有一些非常基本的疑问,因为我不太理解这个内存映射的原理。
#include <unordered_map>
#include <boost/iostreams/device/mapped_file.hpp>
using namespace boost::interprocess;
using namespace std;
typedef unordered_map<int, string> work;
int main()
{
boost::iostreams::mapped_file_params params;
params.path = "map.dat";
params.new_file_size = 100;
params.mode = (std::ios_base::out | std::ios_base::in);
boost::iostreams::mapped_file mf;
mf.open(params);
work w1;
w1[0] = "abcd";
w1[1] = "bcde";
w1[2] = "cdef";
work* w = static_cast<work*>((void*)mf.data());
*w = w1;
mf.close();
return 0;
}
我有几个问题:
当我执行mf.open(params)时,我发现磁盘上创建了一个大小为100的文件。 现在当我写入它即*w = w1,磁盘上的文件内容会发生改变。 这是否意味着我根本没有使用RAM,直接写入磁盘?
当我执行mf.size()时,它总是给我输入的大小作为实际创建的文件大小。我怎样才能找出我实际写入内存映射文件的数据大小?
如果我设置params.new_file_size = 10GB,则会在磁盘上创建一个该大小的文件,但不占用任何磁盘空间,通过使用df cmd进行确认。为什么会这样? -rwx------. 1 root root 10000000000 Apr 29 14:26 map.dat
我读到close file会释放映射。这是否意味着我在关闭后失去了所有写入的数据?但这并不正确,因为我有可行的代码,在关闭并重新打开文件后可以正确读取。
如何删除使用后创建的内存映射文件?通过使用rm -rf cmd/linux apis吗?