系统允许映射一个文件的相同数据的多个视图。只要映射相同的文件映射对象 ,系统就会确保映射的 视图 数据的相关性。
例如,如果你的应用程序改变了一个视图中的文件内容,那么所有其他视图均被更新以反映这个变化。这是因为尽管页面多次被映射到进程 的虚拟地址空间,但是系统只将 数据放在单个 RAM 页面上 。如果多个进程映射单个数据文件的视图,那么数据仍然是相关的,因为在数据文件中,每个 RAM 页面只有一个实例 —— 正是这个 RAM 页面被映射到多个进程的地址空间。
注意: Windows 允许创建若干个由单个数据文件支持的文件映射对象。 Windows 不能保证这些不同的文件映射对象 的视图具有相关性。 它只能保证单个文件映射对象的多个视图具有相关性。
例子(vs2008代码下载 )
// ------------------------------------------------------------
// 文件名 : 17_MapViewOfFile.cpp
// 创建者 : 方煜宽
// 邮箱 : fangyukuan@gmail.com
// 创建时间 : 2010-9-6 15:36
// 功能描述 : 内存映射文件与数据视图的相关性
// 本例子中,改变视图 1 的数据,结果视图 2 的数据,也跟着变了
//
// ------------------------------------------------------------
#include "stdafx.h"
#include "windows.h"
#include <iostream>
using namespace std ;
int _tmain (int argc , _TCHAR * argv [])
{
// 注意请在 c 盘,自己创建一个 kuan.txt 文件,并写入内容
HANDLE hFile = ::CreateFile (L "C://kuan.txt" ,
GENERIC_READ | GENERIC_WRITE ,
0,
NULL ,
OPEN_ALWAYS ,
FILE_ATTRIBUTE_NORMAL ,
NULL );
HANDLE hFileMapping = ::CreateFileMapping (hFile ,
NULL ,
PAGE_READWRITE ,
0, 0,
NULL );
// 注意 dwDesiredAccess 为 FILE_MAP_WRITE
PBYTE pbFile1 = (PBYTE )::MapViewOfFile (hFileMapping , FILE_MAP_WRITE , 0, 0, 0);
PBYTE pbFile2 = (PBYTE )::MapViewOfFile (hFileMapping , FILE_MAP_WRITE , 0, 0, 0);
cout << "View1 : " << pbFile1 << endl ;
cout << "View2 : " << pbFile2 << endl ;
// 改变视图
char szTemp [] = "fangyukuan_kfmmcz****" ;
memcpy (pbFile1 , szTemp , strlen (szTemp ));
// 结果视图和都变了
cout << "View1 : " << pbFile1 << endl ;
cout << "View2 : " << pbFile2 << endl ;
::UnmapViewOfFile (pbFile1 );
::UnmapViewOfFile (pbFile2 );
::CloseHandle (hFileMapping );
::CloseHandle (hFile );
return 0;
}
本文地址:http://www.cnblogs.com/fangyukuan/archive/2010/09/09/1822269.html