内存映射文件:把一个硬盘上的文件,直接映射到物理页上,然后再把物理页上的内存直接映射到虚拟内存中;在虚拟内存中操作就直接相当于操作文件;
内存映射文件示例:
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进程可以看到能读到数据,且最后关闭程序后文件中有数据写入;