zoukankan      html  css  js  c++  java
  • 学习:内存映射文件

    代码实现的功能:通过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,可以达到保护的作用,以后自己理解了再继续补充

  • 相关阅读:
    用记事本编写C#程序并运行C#代码
    C#传递参数大集合
    JQuery或JavaScript获取网页的宽度、高等
    mybatis
    mysql 函数
    eclipse sts 常规操作
    谷歌浏览器自动翻译当前网页
    推荐Calendar操作日期
    IDEA 快捷键
    eclipse sts 快捷键
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/12256032.html
Copyright © 2011-2022 走看看