【发布时间】:2014-02-25 20:51:46
【问题描述】:
我正在重新学习 C++,我需要使用内存映射文件。我决定使用 boost(因为它似乎是可靠的库)。
我创建了一个映射到双精度数组的内存映射文件,并写入该数组中的第一个双精度。磁盘文件在前四个字节中包含一些数据,其余的都归零,这对我来说很奇怪,因为通常如果我在 C++ 中获得指向内存位置的指针,在大多数情况下我必须假设它包含垃圾。
我是否可以保证新创建的内存映射文件将被清零(至少在 Linux 上)?我没有找到任何参考。
BOOST_AUTO_TEST_CASE(OpenMMapFile){
boost::iostreams::mapped_file file;
boost::iostreams::mapped_file_params params;
params.path = "/tmp/mmaptest-1";
params.mode = std::ios::in | std::ios::out;
params.new_file_size = 10*sizeof(double);
file.open(params);
double* data = static_cast<double*>((void*)file.data());
data[0] = 12;
file.close();
}
这是文件内容:
cat /tmp/mmaptest-1 | base64
AAAAAAAAKEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
编辑
正如@Zan 所指出的 --- boost 实际上使用 ftruncate 来调整 mmaped 文件的大小,因此可以保证归零(至少在 Linux 上)。
【问题讨论】:
-
在 Unix/Linux 上,操作系统提供了数据不泄露的安全保证,因此当分配文件或内存区域时,它不能允许进程查看磁盘/内存上的内容在以前的文件/进程中。满足此保证的最简单方法是将内存归零。这就是它的作用。
-
richard 将 linux 与 Windows95 进行比较?
标签: c++ linux boost mmap memory-mapped-files