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

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

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

共享内存

  其实微软件的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;

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

原文地址:https://www.cnblogs.com/ice-arrow/p/11904364.html

时间: 2024-10-20 00:12:13

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

通过共享内存进行进程间通信

共享内存的工作方式 顾名思义,共享内存让一段内存可供多个进程访问.用特殊的系统调用(即对 UNIX 内核的请求)分配和释放内存并设置权限:通过一般的读写操作读写内存段中的数据. 共享内存并不是从某一进程拥有的内存中划分出来的:进程的内存总是私有的.共享内存是从系统的空闲内存池中分配的,希望访问它的每个进程连接它.这个连接过程称为映射,它给共享内存段分配每个进程的地址空间中的本地地址. 假设在同一系统上有两个进程 A 和 B 正在运行(见 图 1),它们可以通过共享内存进行协作和共享信息.在图中

Android系统匿名共享内存Ashmem(Anonymous Shared Memory)驱动程序源代码分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6664554 在上一文章Android系统匿名共享内存Ashmem(Anonymous Shared Memory)简要介绍和学习计划中, 我们简要介绍了Android系统的匿名共享内存机制,其中,简要提到了它具有辅助内存管理系统来有效地管理内存的特点,但是没有进一步去了解它是如何实 现的.在本文中,我们将通过分析Android系统的匿名共享内存

Windows进程间共享内存通信实例

抄抄补补整出来 采用内存映射文件实现WIN32进程间的通讯:Windows中的内存映射文件的机制为我们高效地操作文件提供了一种途径,它允许我们在WIN32进程中保留一段内存区域,把硬盘或页文件上的目标文件映射到这段虚拟内存中.注意:在程序实现中必须考虑各进程之间的同步问题. 在Windows操作系统下,任何一个进程不允许读取.写入或是修改另一个进程的数据(包括变量.对象和内存分配等),但是在某个进程内创建的文件映射对象的视图却能够为多个其他进程所映射,这些进程共享的是物理存储器的同一个页面. 因

ACE框架 基于共享内存的进程间通讯

ACE框架将基于共享内存的进程间通讯功能,如其它IO组件或IPC组件一样,设计成三个组件.流操作组件ACE_MEM_Stream,连接器组件ACE_MEM_Connector,以及接收连接组件ACE_MEM_Accpter.ACE框架为基于共享内存的进程间通讯提供了两种数据传输(分发deliver)策略.一种是使用生产者-消费者队列的一对多的多用户MT策略,另一种是使用socket流的可以使用反应器响应数据接收事件的Reactor策略.不论哪一种策略都要通过socket进行TCP连接,并进行进程

Linux下使用awk批量删除共享内存

1.awk简介 awk 是一个强大的文本分析工具.sed 常常用于一整个行的处理,而 awk 则倾向于以空格和tab键为默认分隔符将每行切片成一个个域(也就是一列)来处理.awk适用于小型的数据处理. awk有3个不同版本: awk.nawk和gawk,未作特别说明,一般指gawk,gawk 是 awk 的 GNU 版本. 2. awk语法格式 awk 'pattern1{action1} pattern2{action2} -' filename awk 后面接两个单引号并加上大括号 {} 来

一个基于共享内存的ipc通信框架

一个基于共享内存的ipc通信框架 与共享内存相关的操作主要包括共享内存的初始化, 共享内存的释放, 共享内存的锁的相关操作, 在这里操作共享内存的环境是: 1 多个进程没有亲缘关系, 也没有server/client关系, 是多个不相关进程并发操作共享内存 2 共享内存一开始不存在, 由第一个访问他的进程创建 3 当共享内存退出时, 由最后一个离开的进程释放共享内存, 并清除信号量 在这个问题之中, 主要有两个比较大的问题: 1 怎样新建并初始化共享内存 新建共享内存的数据都可以用信号量来控制,

Linux IPC之共享内存C 事例

Linux IPC之共享内存 标签: linuxrandomnull工作 2011-08-25 11:52 4123人阅读 评论(0) 收藏 举报  分类: Linux(3)  读书札记(3)  版权声明:本文为博主原创文章,未经博主允许不得转载. 简介 共享内存(shared memory)是最简单的Linux进程间通信方式之一.使用共享内存,不同进程可以对同一块内存进行读写.由于所有进程对共享内存的访问就和访问自己的内存空间一样,而不需要进行额外系统调用或内核操作,同时还避免了多余的内存拷贝

linux程序设计——共享内存(第十四章)

14.2    共享内存 共享内存是3个IPC机制中的第二个,它允许两个不相关的进程访问同一个逻辑内存.共享内存是在两个正在运行的进程之间传递数据的一种非常有效的方式.大多数共享内存的具体实现,都把由不同进程之间共享的内存安排为同一段物理内存. 共享内存是由IPC为进程创建的一个特殊的地址访问,它将出现在该进程的地址空间中,其他进程可以将同一段共享内存连接到它们自己的地址空间中.所有进程都可以访问共享内存中的地址,就好像它们是由malloc分配的一样.如果某个进程向共享内存写入了数据,所做的改动

c++共享内存(转载)

对于连个不同的进程之间的通信,共享内存是一种比较好的方式,一个进程把数据发送到共享内存中, 另一个进程可以读取改数据,简单记录一下代码 1 #define BUF_SIZE 256 2 TCHAR szName[]=TEXT("Global\\YourFileMappingObject"); //指向同一块共享内存的名字 3 4 int SetFileName(LPCTSTR str) 5 { 6 HANDLE hMapFile; 7 LPCTSTR pBuf; 8 9 hMapFil