您的位置:首页 > 其它

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

2012-07-09 10:56 288 查看
在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);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: