进程间通信

来源:互联网 发布:php qq农场游戏源码 编辑:程序博客网 时间:2024/05/20 22:02
采用内存映射文件实现WIN32进程间的通讯:Windows中的内存映射文件的机制为我们高效地操作文件提供了一种途径,它允许我们在WIN32进程中保留一段内存区域,把目标文件映射到这段虚拟内存中。在程序实现中必须考虑各进程之间的同步问题。具体实现步骤如下:

1、在服务器端进程中调用内存映射API函数CreateFileMapping创建一个有名字标识的共享内存;

函数CreateFileMapping原型

HANDLE CreateFileMapping (

HANDLE hFile,      // 映射文件的句柄,若设为0xFFFFFFFF则创建一个进程间共享的对象

LPSECURITY_ATTRIBUTES lpFileMappingAttributes,    // 安全属性DWORD flProtect,     // 保护方式

DWORD dwMaximumSizeHigh,    //对象的大小

DWORD dwMaximumSizeLow,   

LPCTSTR lpName     // 映射文件名,即共享内存的名称 );

  

与虚拟内存类似,保护方式参数可以是PAGE_READONLY或是PAGE_READWRITE。如果多进程都对同一共享内存进行写访问,则必须保持相互间同步。映射文件还可以指定PAGE_WRITECOPY标志,可以保证其原始数据不会遭到破坏,同时允许其他进程在必要时自由的操作数据的拷贝。

例如:创建一个名为“zzj”的长度为4096字节的有名映射文件: 

HANDLE m_hMapFile=CreateFileMapping((HANDLE)0xFFFFFFFF), 

NULL,PAGE_READWRITE,0,0x1000," zzj"); 

2、在创建文件映射对象后,服务器端进程调用MapViewOfFile函数映射到本进程的地址空间内;

例:映射缓存区视图 

void* m_pBaseMapFile=MapViewOfFile(m_hMapFile, 

FILE_MAP_READ|FILE_MAP_WRITE, 

0,0,0); 

3、客户端进程访问共享内存对象,需要通过内存对象名调用OpenFileMapping函数,以获得共享内存对象的句柄 

HANDLE m_hMapFile =OpenFileMapping(FILE_MAP_WRITE, 

FALSE," zzj"); 

4、如果客户端进程获得共享内存对象的句柄成功,则调用MapViewOfFile函数来映射对象视图。用户可以使用该对象视图来进行数据读写操作,以达到数据通讯的目的。 

例:映射缓存区视图 

void* m_pBaseMapFile=MapViewOfFile(m_hMapFile, 

FILE_MAP_READ|FILE_MAP_WRITE, 

0,0,0); 

5、当用户进程结束使用共享内存后,调用UnmapViewOfFile函数以取消其地址空间内的视图: 

if (m_pBaseMapFile) 



UnmapViewOfFile(m_pBaseMapFile); 

SharedMapView=NULL; 


转自:http://bbs.csdn.net/topics/230036416

0 0