windows笔记-内存映射文件与数据视图的相关性

系统允许映射一个文件的相同数据的多个视图。只要映射相同的文件映射对象 ,系统就会确保映射的 视图 数据的相关性。

例如,如果你的应用程序改变了一个视图中的文件内容,那么所有其他视图均被更新以反映这个变化。这是因为尽管页面多次被映射到进程 的虚拟地址空间,但是系统只将 数据放在单个 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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值