【发布时间】:2017-04-26 01:24:48
【问题描述】:
我想保留一个内存区域,然后将文件连续映射到保留的内存中。在映射文件之间可能存在很大的时间间隔,在此期间其他函数可能会从堆中分配内存。一旦映射,文件可能不会被取消映射并映射到新的内存位置。
在 Linux 上类似于:
#include <iostream>
#include <sys/mman.h>
#include <unistd.h>
#include <fcntl.h>
#include <cerrno>
int main(){
void *memory = mmap(nullptr, getpagesize() * 2,
PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE | MAP_NORESERVE, -1, 0); // reserve memory
int handle1 = ::open("1", O_CREAT | O_RDWR, S_IRWXU); // open file1
int handle2 = ::open("2", O_CREAT | O_RDWR, S_IRWXU); // open file2
void *data = mmap(memory, getpagesize(), PROT_READ | PROT_WRITE, MAP_SHARED |MAP_FIXED, handle1, 0); // map first file into reserved memory
void *data2 = mmap(static_cast<char *>(memory) + getpagesize(), getpagesize(), PROT_READ | PROT_WRITE, MAP_SHARED | MAP_FIXED, handle2, 0); // map second file into reserved memory
}
但在 Windows 上,我似乎找不到正确的方法来执行此操作。有谁知道这是怎么做到的?
编辑: 由于我的目标似乎并不那么容易理解。再次简化:
我想要内存映射的内存。一旦映射的内存被数据填充,我想在已经映射的内存之后直接将一个新文件映射到内存中以扩展映射的内存(不会在两个内存映射区域之间留下间隙)。
在以后的程序启动时,这些文件可用于恢复之前运行的所有数据。
解决稀疏文件和扩展现有文件的问题: 如果不再需要文件,程序应该能够删除它们。因此,映射始终是新文件很重要。
您可能会将其更多地视为分配器。需要内存映射内存。该库映射一个内存块并返回一个指向子块的指针。不再需要内存,它被返回给分配器。如果不再需要整个映射,则删除关联的文件(如果不再需要,则映射不需要写入数据)。
【问题讨论】:
-
google "windows 内存映射文件"
-
这不是关于映射文件,这很容易。它是关于将文件映射到以前保留的内存中,这样我就可以将不同的文件映射到连续的内存中
-
@johnST - 在 Windows 上这是不可能的 - 如果您尝试将文件映射到保留内存,则会收到错误
STATUS_CONFLICTING_ADDRESSES -
这听起来像是一个 XY 问题。也许您应该询问您正在尝试解决的真正问题,而不是如何实施您的解决方案。
-
这不是你的目标,需要额外的解释。这是您要解决的整体问题,我们对此知之甚少。如果您解释您最终要完成的工作,我们可以提出更好的建议。
标签: c++ c windows winapi memory-mapping