使用内存映射文件在进程之间共享数据

数据共享方法是通过让两个或多个进程映射 同一个文件映射对象 的视图来实现的,这意味着它们将共享物理存储器的同一个页面。因此,当一个进程将数据写入一个共享文件映射对象的视图时,其他进程可以立即看到它们视图中的数据变更情况。

 

注意:如果多个进程共享单个文件映射对象,那么所有进程必须使用相同的名字来表示该文件映射对象。

 

//------------------------------------------------------------

// 文件名    : 17_FileMapping_SharaData.cpp

// 创建者    方煜宽

//  邮箱      fangyukuan@gmail.com

// 创建时间   :  2010-9-6 16:15

// 功能描述   使用内存映射文件在进程之间共享数据

//              请运行多个进程以观察进程之间共享数据的效果

// ------------------------------------------------------------

#include "stdafx.h"

#include "windows.h"

#include "process.h"

#include <iostream>

using namespace std;

 

HANDLE g_hTimer = NULL;

 

DWORD WINAPI Thead(void* pParam)

{

   HANDLE hFileMapping = (HANDLE)pParam;

   int nIndex = 0;

   while (true)

   {

      ::WaitForSingleObject(g_hTimer, INFINITE);

 

      void* pbFile = (void*)::MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, 0);

      cout << nIndex++ << " :"<< (PBYTE)pbFile << endl;

      ::UnmapViewOfFile(pbFile);

   }

   return 0;

}

 

int _tmain(int argc, _TCHAR* argv[])

{

   HANDLE hFileMapping = ::CreateFileMapping(INVALID_HANDLE_VALUE,

      NULL,

      PAGE_READWRITE,

      0, 99,

      TEXT("kuan_FileMap"));

 

   void* pbFile = (void*)::MapViewOfFile(hFileMapping, FILE_MAP_WRITE, 0, 0, 0);

 

   char szTemp[999] = {0};

   cout << "input data:";

   cin >> szTemp;

   memcpy(pbFile, szTemp, strlen(szTemp));

   ::FlushViewOfFile(pbFile, 999);

 

 

   // 下面是创建一个等待定时器

   DWORD dwTheadID;

   HANDLE hThead = ::CreateThread(NULL, 0, Thead, hFileMapping, 0, &dwTheadID);

   g_hTimer = ::CreateWaitableTimer(NULL, FALSE, NULL);

 

   LARGE_INTEGER li;

   li.QuadPart = 0;

   ::SetWaitableTimer(g_hTimer, &li, 1000, NULL, NULL, FALSE);

 

 

   ::WaitForSingleObject(hThead, INFINITE);

   ::UnmapViewOfFile(pbFile);

 

   ::CloseHandle(hFileMapping);

 

   ::CloseHandle(hThead);

   ::CloseHandle(g_hTimer);

 

   return 0;

}



看运行效果:先运行一个进程,输入数据。再打开另一个进程,输入数据,可以看到第一个进程的输出数据也改变了。 



本文地址:http://www.cnblogs.com/fangyukuan/archive/2010/09/09/1822310.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值