1. 程式人生 > >14 記憶體對映檔案

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程序可以看到能讀到資料,且最後關閉程式後文件中有資料寫入;