14 内存映射文件

内存映射文件:把一个硬盘上的文件,直接映射到物理页上,然后再把物理页上的内存直接映射到虚拟内存中;在虚拟内存中操作就直接相当于操作文件;
内存映射文件示例:
A程序代码如下:

/*
 *MappingFile.h
 */
#ifndef FILE_SYSTEM_H
#define FILE_SYSTEM_H
#include <windows.h>
#include <stdio.h>

#define MAPPINGNAME TEXT("shared_memory")

DWORD MappingFile(LPCWSTR lpcFile);

#endif

/*
 *MappingFile.c
 */

#include "MappingFile.h"

/*
*通过文件映射读写文件
*参数:lpcFile文件路径
*返回值:1 成功 0 失败
*/
DWORD MappingFile(LPCWSTR lpcFile)
{
	HANDLE hFile;
	HANDLE hMapFile;
	LPVOID lpAddr;

	//1.创建文件
	hFile = CreateFile(
		lpcFile,
		GENERIC_READ | GENERIC_WRITE,
		FILE_SHARE_READ,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL,
		NULL);
	if (hFile == INVALID_HANDLE_VALUE){
		return 0;
	}

	//2.创建FileMapping对象
	hMapFile = CreateFileMapping(hFile,
		NULL, PAGE_READWRITE, 0, 0, MAPPINGNAME);
	if (hMapFile == INVALID_HANDLE_VALUE){
		CloseHandle(hFile);
		return 0;
	}

	//3.映射到虚拟内存
	lpAddr = (LPTSTR)MapViewOfFile(hMapFile,
		FILE_MAP_ALL_ACCESS, //此参数如果为FILE_MAP_COPY则可以设置为写拷贝
		0, 0, 0);
	if (lpAddr == NULL){
		CloseHandle(hMapFile);
		CloseHandle(hFile);
		return 0;
	}

	//4.写数据
	DWORD dwTest = 0x41414141;
	*(PDWORD)lpAddr = dwTest;
	printf("A进程写入:%x\n", dwTest);
	getchar();
	//FlushViewOfFile((PDWORD)lpAddr, 4);//强制刷新缓存
	
	//5.关闭资源
	UnmapViewOfFile(lpAddr);
	CloseHandle(hMapFile);
	CloseHandle(hFile);

	return 1;
}
/*
 * A.c
 */
#include "MappingFile.h"

int main()
{
	DWORD dwRet = MappingFile(TEXT("D:\\Test.txt"));
	
	return 0;
}

B程序代码如下:

/*
 *B.c
 */
#include <stdio.h>
#include <windows.h>

#define MAPPINGNAME TEXT("shared_memory")

int main()
{
	HANDLE hMapFile;
	LPVOID lpAddr;
	//1.打开FileMapping对象
	hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS,
		FALSE, MAPPINGNAME);
	if (hMapFile == INVALID_HANDLE_VALUE){
		return 0;
	}

	//2.映射到虚拟内存
	lpAddr = (LPTSTR)MapViewOfFile(hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
	if (lpAddr == NULL){
		CloseHandle(hMapFile);
		return 0;
	}
	//3.读数据
	DWORD dwTest = *(PDWORD)lpAddr;
	printf("B进程读出数据:%x\n", dwTest);

	//4.关闭资源
	UnmapViewOfFile(lpAddr);
	CloseHandle(hMapFile);

	getchar();
	return 0;
}

我们先打开A进程,然后开启B进程可以看到能读到数据,且最后关闭程序后文件中有数据写入;

猜你喜欢

转载自blog.csdn.net/lifeshave/article/details/85017977
14
今日推荐