我正在研究Windows上的内存映射,并编写了以下代码(出于可读性,我从副本中省略了错误处理):
HANDLE file_h = CreateFile(filename, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
HANDLE map_h = CreateFileMapping(file_h, NULL, PAGE_READWRITE, 0, lengthOfFile + padding, NULL);
char * map;
map = MapViewOfFile(map_h, FILE_MAP_COPY, 0, 0, lengthOfFile + padding);
lengthOfFile 是我以前以此方式计算的文件的长度(出于某些原因,与这种情况无关)
FILE * file;
file = fopen(filename,"rb");
fseek(file, 0, SEEK_END);
int lengthOfFile = ftell(file);
fseek(file, 0, SEEK_SET);
int last = (lengthOfFile % 4);
int n_pack = (int)(lengthOfFile / 4);
int padding = 4 - last;
并且 padding 是我需要添加的一些额外长度(您可以通过阅读上面的代码来找出原因)。
然后,我对内存映射文件执行一些操作,包括对其的修改以及将其新值分配给另一个函数。
如何做到这一点,以便当我同时关闭 file_h 和 map_h 来处理源文件(文件名)时,保持不变(正确现在,由于关闭了附加的 padding ,因此一旦关闭它的句柄,它就会被修改,显然是在它的句柄关闭后立即“掉入”了源文件)?
我尝试将 PAGE_WRITECOPY 标志与 PAGE_READWRITE (用于修改内存映射文件的内容)一起使用,但使用 CreateFileMapping 函数无法返回 ERROR_INVALID_PARAMETER (87)错误。
换句话说,我需要使用以下方法实现与Unix中相同的行为:
mmap(0,lengthOfFile + padding,PROT_READ | PROT_WRITE, **MAP_PRIVATE**,fileno(file),0);
我想关键是 MAP_PRIVATE 属性。