簡體   English   中英

mmap 打開並從文件中讀取

[英]mmap open and read from file

我正在映射一個巨大的文件,以避免我的應用程序抖動到主虛擬 memory,並且能夠使用超過我擁有的 RAM 運行該應用程序。 代碼為 c++,但部分遵循舊的 c API。 當我使用分配的指針時,memory 會根據需要返回到文件。 但是,當我下次運行該應用程序時,我希望從已經具有准備好的數據的同一個文件中讀取 memory。 出於某種原因,在下一次運行中,我讀回了所有零。 我究竟做錯了什么? 是 ftruncate 調用嗎? 是帶有錯誤標志的 fopen 調用嗎? 是 mmap 標志嗎?

int64_t mmbytes=1<<36;
FILE *file = fopen(filename, "w+");
int fd = fileno(file);
int r = ftruncate(fd, mmbytes );
if (file == NULL || r){
    perror("Failed: ");
    throw std::runtime_error(std::strerror(errno));
} // 

if ((mm = mmap(0, mmbytes,  
        PROT_READ | PROT_WRITE, MAP_FILE | MAP_SHARED, fd, 0)) == MAP_FAILED)
  {
        fprintf(stderr,"mmap error for output, errno %d\n", errno);
        exit(-1);
  } 
 }
FILE *file = fopen(filename, "w+");

我建議您參考fopen的手冊頁,其中對“w+”的描述如下:

       w+     Open  for  reading  and writing.  The file is created if it does
              not exist, otherwise it is truncated.  The stream is  positioned
              at the beginning of the file.

我特別提請您注意“它被截斷”部分。 換句話說,如果現有文件中有任何內容,這最終會將其從高軌道上摧毀。

根據您正在做的其他事情,“a”會更好。

更好的辦法是完全忘記fopen ,而只使用open

int fd=open(filename, O_RDWR|O_CREAT, 0666);

這是您的文件描述符,無需跳過任何環節。 文件被創建,如果它已經存在則保持不變。

暫無
暫無

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

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