14 記憶體對映檔案
阿新 • • 發佈:2019-01-01
記憶體對映檔案:把一個硬碟上的檔案,直接對映到物理頁上,然後再把物理頁上的記憶體直接對映到虛擬記憶體中;在虛擬記憶體中操作就直接相當於操作檔案;
記憶體對映檔案示例:
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程序可以看到能讀到資料,且最後關閉程式後文件中有資料寫入;