共享内存方式(SharedMemory)

原创 2013年12月05日 17:35:49

 

 
 
共享内存方式(SharedMemory)

内存映射一般是做进程间通讯的,线程间通信有太多方法了。
a.设定一块共享内存区域,得到共享内存的指针

HANDLE CreateFileMapping(HANDLE,LPSECURITY_ATTRIBUTES,DWORD,DWORD,DWORD,LPCSTR) 
	LPVOIDMapViewOfFile(
	HANDLEhFileMappingObject,
	DWORDdwDesiredAcess,
	DWORDdwFileOffsetHigh,
	DWORDdwFileOffsetLow,
	DWORDdwNumberOfBytesToMap
);
  
b.找出共享内存
 决定这块内存要以点对点(peertopeer)的形式呈现每个进程都必须有相同的能力,产生共享内存并将它初始化。
  每个进程都应该调用CreateFileMapping(),然后调用GetLastError().如果传回的错误代码是ERROR_ALREADY_EXISTS,
  那么进程就可以假设这一共享内存区域已经被别的进程打开并初始化了,否则该进程就可以合理的认为自己排在第一位,并接下来将共享内存初始化。
 还是要使用client/server架构中只有server进程才应该产生并初始化共享内存。所有的进程都应该使用

HANDLE OpenFileMapping( DWORDdwDesiredAccess,BOOLbInheritHandle,LPCTSTRlpName );
  
  再调用MapViewOfFile(),取得共享内存的指针
c.同步处理(Mutex)
d.清理(Cleaningup)

BOOL UnmapViewOfFile( LPCVOIDlpBaseAddress );

CloseHandle();


内存映射文件方法
1、 服务器端代码:
//0xFFFFFFFF表示创建一个进程间共享的对象
HANDLE hMapFile = CreateFileMapping( (HANDLE)0xFFFFFFFF, NULL, PAGE_READWRITE, 0, MemorySize, "SharedMemory1" );
if( hMapFile == NULL )
{
	AfxMessageBox("Create SharedMemory 出错");
	return;
}
//如果函数返回成功,返回值为文件对象句柄;
//如果这个SharedMemory1已经存在,函数返回这个存在的句柄(大小为现在的大小),GetLastError函数会返回 ERROR_ALREADY_EXISTS。


LPVOID pFile;
pFile= MapViewOfFile(hMapFile,FILE_MAP_WRITE|FILE_MAP_READ,0,0,0);
if (pFile == NULL)
{
	AfxMessageBox("MapViewOfFile出错!");
	return;
}
CString str;
GetDlgItemText(IDC_EDIT1,str);
strcpy((char*)pFile,str.GetBuffer(str.GetLength()));
//CloseHandle(hMapFile); //不能加,否则客户端收不到,所以一般会将这个句柄作为一个全局变量
2、 客户机端代码:
HANDLE hMap;
hMap= OpenFileMapping( FILE_MAP_READ|FILE_MAP_WRITE,
											 TRUE,
											 "SharedMemory1"
											);
LPVOID pVoid;
pVoid=::MapViewOfFile(hMap,FILE_MAP_READ,0,0,0);
CString str=(char*)pVoid;
SetDlgItemText(IDC_EDIT1,str);
UnmapViewOfFile(pVoid);
CloseHandle(hMap);

相关文章推荐

进行通信,共享内存方式

  • 2014年06月03日 18:22
  • 88KB
  • 下载

多线程访问共享内存的不加锁实现方式

http://blog.csdn.net/alane1986/article/details/6887359 多线程访问共享内存,为了实现同步,常采用加锁的方式。 那么,如何采用不加锁...
  • ywh147
  • ywh147
  • 2013年03月14日 22:53
  • 10350

进程间通讯的消息队列和共享内存方式的实现

qt,进程间通讯,消息传递模式,共享内存模式

Linux下进程间共享内存编码方式入门

同一台电脑上一些相关进程间的通讯方式有很多种,管道、共享文件,数据库等等。 今天在这里介绍一个(进程间)共享内存的方式。这个方法在linux和windows上都是得到os支持的。他会比数据库或者共享文...

Linux进程间的通信方式:共享内存的使用

一、共享内存的概念 共享内存就是允许多个不相关的进程访问的同一个物理内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种最快的方法,不同进程之间共享的内存通常安排为同一段物理内存。进...

进程通信方式--共享内存(shm)--实现自由通信

//欢迎大家评论提出意见 #include"utili.h" #include #include #include #include #include #include #include #inclu...

Linux 进程间通信 - 共享内存shmget方式(转)

共享内存区域是被多个进程共享的一部分物理内存。如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信。共享内存是进程间共享数据的一种最...
  • wdt3385
  • wdt3385
  • 2012年10月16日 08:38
  • 897

Linux 进程间通信 - 共享内存shmget方式

转自:http://zsying0826.blog.163.com/blog/static/11602640420114252244562/  共享内存区域是被多个进程共享的一部分物理内存。如果...

Linux\Unix IPC进程通信实例分析(一):共享内存通信---文件映射mmap方式

说明:这个例子是采用共享文件映射形式,写端写入数据,读端读取数据。 写端:  /*-------------map_normalfile1.c-----------*/ #include #in...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:共享内存方式(SharedMemory)
举报原因:
原因补充:

(最多只允许输入30个字)