c++ - boost 内存映射文件是否在 Linux 上归零

标签 c++ linux boost mmap memory-mapped-files

我正在重新学习 C++,我需要使用内存映射文件。我决定使用 boost(因为它似乎是可靠的库)。

我创建了一个映射到 double 组的内存映射文件,并写入该数组中的第一个 double 。磁盘文件的前四个字节包含一些数据,其余部分被清零,这对我来说很好奇,因为如果我在 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

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=

编辑

正如@Zan 指出的那样——boost 实际上使用 ftruncate 来调整映射文件的大小,因此保证了归零(至少在 Linux 上)。

最佳答案

内存映射文件包含文件中的任何内容。

如果它是一个新文件,它已经扩展到正确的大小并且扩展名将包含零。扩展文件通常使用 ftruncate 函数完成。

ftruncate 联机帮助页说:

   If  the  file  previously  was larger than this size, the extra data is
   lost.  If the file previously was shorter,  it  is  extended,  and  the
   extended part reads as null bytes ('\0').

所以是的,零是有保证的。

关于c++ - boost 内存映射文件是否在 Linux 上归零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22025912/

相关文章:

c - ls 如何对文件名进行排序?

linux - 如何从服务器 SCP 选定的文件

c++ - CMake 在使用 android-cmake 工具链文件时找不到 Boost 库

c++ - 关于无限循环(C++)

c++ - C++ 中直线与线段的交点

c++ - C++ 输出中的微笑

linux - 自动清空内存缓存

C# 正则表达式到 C++ boost::regex

c++ - Boost.Asio SSL 神秘线程

c++ - 如何在 Linux 上用 C++ 读取 JPEG 和 PNG 像素?