学习:内存映射文件

代码实现的功能:通过MapViewOfFile把虚拟内存映射到物理页上,使其两方进程读取同一物理页,同样能够实现节省资源的功能

实例代码:

#include<windows.h>
#include<stdio.h>

#define MappingName "mymapping"
int main() {
	HANDLE hMapping;
	PDWORD buf;

	//创建内核对象:物理页
	hMapping = CreateFileMapping(
		INVALID_HANDLE_VALUE, //为null则为创建创建页
		NULL,
		PAGE_EXECUTE_READWRITE, //对象页面的属性为可读写执行
		0,
		0x1000,
		MappingName);

	//将物理页与虚拟地址进行关联映射
	buf = (PDWORD)MapViewOfFile(hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0x1000);

	*buf = 0x12345678;
	printf("%x", *buf);  //打印该buf的地址
	getchar();

	//关闭映射
	UnmapViewOfFile(buf);
	CloseHandle(hMapping);
	return 0;

}


内存映射文件:自己的理解就是将文件与映射到物理内存中,然后再通过虚拟内存映射到物理页中,实现进程来操作文件

#include<windows.h>
#include<stdio.h>

#define MappingName "MyMapping"
int main() {
	HANDLE hMapping;
	HANDLE hFile;
	LPVOID buf;

	
	hFile = CreateFile(
		"1.txt",
		GENERIC_READ | GENERIC_WRITE,
		0,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,
		NULL
		);

	if (hFile == INVALID_HANDLE_VALUE) {
		printf("error : %d
", GetLastError());
		CloseHandle(hFile);
		return -1;
	}


	//创建内核对象:FileMapping对象
	hMapping = CreateFileMapping(  //这里能够将文件映射到物理页上
		hFile,
		NULL,
		PAGE_READWRITE, 
		0,
		0,
		MappingName);

	if (hMapping == NULL) {
		printf("创建FileMapping对象失败");
		CloseHandle(hMapping);
		return -1;
	}

	//将物理页与虚拟地址进行关联映射
	buf = MapViewOfFile(hMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);

	//读文件
	printf("%x
", *(PDWORD)buf); // 输出为0x30303030  ——》 0000

	//写文件
	*(PDWORD)buf = 0x40404040;
	
	printf("%x
", *(PDWORD)buf); // 输出为@@@@0000000 
	FlushViewOfFile(buf); //由于写入的时候是先写到缓存,最后结束的时候才会进行写入,所以需要进行强制更新缓存的操作

	
	//关闭映射
	UnmapViewOfFile(buf);

	CloseHandle(hMapping);
	
	CloseHandle(hFile);

	system("pause");

	return 0;

}


写拷贝:

MapViewOfFile:dwDesiredAccess设置为FILE_MAP_COPY,可以达到保护的作用,以后自己理解了再继续补充

原文地址:https://www.cnblogs.com/zpchcbd/p/12256032.html