共享内存——如何在本地没有句柄的两个地方互传数据

Posted IceArrow

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了共享内存——如何在本地没有句柄的两个地方互传数据相关的知识,希望对你有一定的参考价值。

 

  一直对匿名管道这个名字有着相当的兴趣,然而至今没有完全弄明白匿名管道的原理,可能本人的记忆属于感觉型的,没有经历过的东西印象始终不深,以至于一些技术虽然当时理解了,一段时间之后使大抵的都忘了。

现在有一种更简单,且觉得相当实用的数据传递方法,记录下来以加深记忆。

 

共享内存

  其实微软件的sendmessage、postmessage内部实现也使用了内存共享技术,该技术初衷是用于解决大文件的频繁读写操作,通过创建一个内核对象的方式,将文件直接映射在内存中,并且提交物理内存到该内存空间,如此一来省去了读写的I/O操作,也不需要为文件开辟缓冲区域。多个进程可以打开该文件内核(内存)进行操作。

  这里的用法是创建一个文件无关的文件内存映射,来进行数据交换,如此一来有一块内存是共享的,在不同的进程中都可以读写,相当的方便。

  与匿名管道类似,没有同步驱动机制。但是这一点可以通过写入窗口句柄之后,再使用sendmessage、postmessge等方式协调的完成整个过程。

  贴出部分代码,大家共勉

1.创建部分

HANDLE m_hShareHandle = CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,dwMapSize,_T("Share"));//创建一个共享内存
if(m_hShareHandle)
{
  m_lpShare = MapViewOfFile(m_hShareHandle,FILE_MAP_WRITE,0,0,dwMapSize);//为该内存为分配空间
  if(m_lpShare)
  {
    char* pBuff = ...//ur code
    strncpy((char*)m_lpShare,pBuff,strHandle.GetLength());//向其中写入数据
    delete []pBuff;
  }    
}

 

2.接收部分

     HANDLE hMap = OpenFileMapping(FILE_MAP_ALL_ACCESS,NULL,_T("Share"));//打开共享内存
        if(hMap)
        {
            char *lp = (char*)MapViewOfFile(hMap,FILE_MAP_ALL_ACCESS,0,0,0);//读该内存

        ....//ur code
UnmapViewOfFile(lp); CloseHandle(hMap);//关闭内存映射
 } return S_OK;

 

文件无关的使用方式如此即可。涉及文件读写的,后续更新了吧 多关随缘了 : )

以上是关于共享内存——如何在本地没有句柄的两个地方互传数据的主要内容,如果未能解决你的问题,请参考以下文章

C内存共享进程通信范例

本地与linux互传文档的方式

自己看的

java运行时内存模型

为啥代客共享不像本地代客那样在请求中添加斜线

JVM内存结构