数据共享方法是通过让两个或多个进程映射同一个文件映射对象的视图来实现的,这意味着它们将共享物理存储器的同一个页面。因此,当一个进程将数据写入一个共享文件映射对象的视图时,其他进程可以立即看到它们视图中的数据变更情况。
注意:如果多个进程共享单个文件映射对象,那么所有进程必须使用相同的名字来表示该文件映射对象。
//------------------------------------------------------------
// 文件名 : 17_FileMapping_SharaData.cpp
// 创建者 : 方煜宽
// 邮箱 : [email protected]
// 创建时间 : 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;
}
看运行效果:先运行一个进程,输入数据。再打开另一个进程,输入数据,可以看到第一个进程的输出数据也改变了。