簡體   English   中英

升級內存映射文件是否在Linux上歸零

[英]Is boost memory mapped file zeroed on Linux

我正在重新學習C ++,我需要使用內存映射文件。 我決定使用boost(因為它似乎是實體庫)。

我創建了一個映射到雙精度數組的內存映射文件,並寫入此數組中的第一個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

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA =

編輯

正如@Zan指出的那樣--- boost實際上使用ftruncate來調整mmaped文件的大小,因此保證歸零(至少在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'). 

所以是的,保證零。

我認為為了實現映射的地址空間實際上是由磁盤空間而不是稀疏文件備份,boost會將文件歸零。 這很慢,特別是如果你想要預先創建一個大的地址空間,這可能永遠不會被完全使用 - 只是為了你可以在這個地址空間中分配許多對象。 他們正在這樣做,因為在寫入內存映射的稀疏文件時,UNIX上沒有可用的方法來處理磁盤空間(暫時忽略像setjmp / longjmp這樣的病態解決方案)。 但是你仍有可能某些其他進程截斷磁盤上的文件,在這種情況下前面提到的問題再次出現。

不幸的是,他們也在Windows上執行此操作(分配與地址空間大小匹配的磁盤空間而不是使用稀疏文件),其中存在結構化異常處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM