利用内存映射实现进程间通信

在Windows中,单个计算机上共享数据的底层机制是内存映射文件。如果互相通信的进程都在同一台计算机上,上面提到的所有机制均使用内存映射文件实现。如果想要达到较高的性能和较小的开销,内存映射文件将是最佳的实现机制。
  内存映射文件是通过两个或多个进程映射同一个文件映射对象的视图来实现的,这意味着它们将共享物理存储器的同一个页面。因此,当一个进程将数据写入一个共享文件映射对象的视图时,其他进程可以立即看到它们视图中的数据变更情况。如果多个进程共享单个文件映射对象,那么所有进程必须使用相同的名字来表示该文件映射对象。
(1)数据发送
  在数据发送进程中,程序应首先调用CreateFileMapping()函数创建一个命名的内存映射对象,得到相应内存起始位置指针lhShareMemory。如果打开成功,则调用MapViewOfFile()函数映射对象的一个视图,得到指向映射到内存的第一个字节的指针lpBuffer并通过该指针读写共享的内存区域。最后使用UnmapViewOfFile()函数来解除视图映射,传入参数为lpBuffer,具体代码如下:
#include<windows.h>
#include<iostream>
using namespace std;
void main()
{
 char str[100]="hello world";
 HANDLE lhshareMemory;
 char *lpBuffer=NULL;
 lhshareMemory=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,4*1024,TEXT("MemorySharedFileAtoB"));
 if(NULL==lhshareMemory)
 {
  if(ERROR_ALREADY_EXISTS==GetLastError())
  {
   printf("file already exists\n");
  }
  else
  {
   cout<<"Create shared memory unsuccessfully!"<<endl;
  }
  return;
 }
 lpBuffer=(char *)MapViewOfFile(lhshareMemory,FILE_MAP_READ|FILE_MAP_WRITE,0,0,0);
 if(NULL==lpBuffer)
 {
  cout<<"Get share memory failed"<<endl;
        UnmapViewOfFile(lpBuffer);
  return;
 }
  strcpy(lpBuffer,str);
     getchar();
}

(2)数据接收
  在数据接收进程中,首先调用OpenFileMapping()函数打开一个命名的内存映射文件对象,得到相应内存起始位置指针lhShareMemory。如果打开成功,则调用MapViewOfFile()函数映射对象的一个视图,得到指向映射到内存的第一个字节的指针lpcBuffer并通过该指针读写共享的内存区域。最后调用UnmapViewOfFile()函数来解除视图映射,传入参数为lpcBuffer,调用CloseHandle()函数来关闭内存映射文件,传入参数为lhShareMemory,具体代码如下:
#include<windows.h>
#include<iostream>
using namespace std;
void main()
{
 char strrev[100];
 HANDLE lhshareMemory;
 char *lpcBuffer;
    lhshareMemory=OpenFileMapping(FILE_MAP_READ|FILE_MAP_WRITE,FALSE,TEXT("MemorySharedFileAtoB")); //创建一个文件映射内核对象
 if(NULL==lhshareMemory)
 {
  cout<<"Open share memory failed"<<endl;
  return;
 }
 lpcBuffer=(char *)MapViewOfFile(lhshareMemory,FILE_MAP_READ|FILE_MAP_WRITE,0,0,0);
 if(NULL==lpcBuffer)
 {
  cout<<"Open share memory failed"<<endl;
 }
 strcpy(strrev,lpcBuffer);
 cout<<strrev<<endl;
 UnmapViewOfFile(lpcBuffer);
 lpcBuffer=NULL;
 CloseHandle(lhshareMemory);
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值