共享内存注意事项

1.共享内存创建类

//构造函数,传递共享内存对象名称、大小

CFileMappingMgr::CFileMappingMgr(const CString & mapName, int mapSize)
{
m_nMapSize = mapSize;

m_hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // use paging file
NULL, // default security
PAGE_READWRITE, // read/write access
0, // maximum object size (high-order DWORD)
mapSize, // maximum object size (low-order DWORD)
mapName); // name of mapping object

if (m_hMapFile == NULL)
{
_tprintf(TEXT("Could not create file mapping object (%d).\n"),
GetLastError());
}
}

//获取共享内存所存储的变量

void * CFileMappingMgr::GetFileMapPtr()
{
void * pRet =
(void*) MapViewOfFile(m_hMapFile, // handle to map object
FILE_MAP_ALL_ACCESS, // read/write permission
0,
0,
m_nMapSize);

if (pRet == NULL)
{
_tprintf(TEXT("Could not map view of file (%d).\n"),
GetLastError());

CloseHandle(m_hMapFile);

return NULL;
}

return pRet;
}

2.使用

int mapSize = sizeof(CSDKMgr);
m_fileMgr = new CFileMappingMgr(L"Global\\MyFileMappingObject", mapSize);
m_pMapSdkMgr = (CSDKMgr*)m_fileMgr->GetFileMapPtr();
if (!m_pMapSdkMgr)
{
return FALSE;
}

int ret = CreateSingleSignal(L"Global\\CreateSingleSignal1");
if (ret == 0)//创建成功,表示尚未有人创建过
{
CSDKMgr* pSdkMgr = new CSDKMgr;

//给共享内存赋值
memcpy(m_pMapSdkMgr, pSdkMgr, mapSize);

//释放临时new生成的变量(并不会导致m_pMapSdkMgr对应的内存内容失效,函数地址已经存在了)
delete pSdkMgr;
pSdkMgr = NULL;
}

//创建命名的互斥变量

int CreateSingleSignal(const TCHAR *processUniqueName)
{
//-------防止多次起动----------
HANDLE hMutex = ::CreateMutex(0, true, processUniqueName);
int nRet = 0;
if (hMutex)
{
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
nRet = 1;// 已存在进程,退出
}
else
{
nRet = 0; // 正常启动

}
}
else
{
nRet = -1;// 无法创建,退出
}

return nRet;
}

时间: 2024-08-24 03:37:17

共享内存注意事项的相关文章

信号,信号量,锁,条件变量,消息通信,共享内存,RPC (一)

在实际项目当中,经常需要把一个功能分成多个子模块实现.那么,这些子模块之间该如何关联起来呢?静态地看,模块可以看作一组完成相同功能的函数:而动态地看,模块可以是一个独立的进程.线程或者一个中断服务或者信号服务例程.根据不同的具体业务实现,它们之间可能是静态调用.动态互斥.同步.唤醒等关系.静态的调用很好实现,上层的函数调用底层的函数即可.那么,动态互斥.同步.唤醒等关系,又该如何实现呢?这就设计到我们将要讨论的信号.进程间消息通信.共享内存.线程互斥同步条件变量.RPC等手段.下面就按照Linu

【Qt】Qt之进程间通信(共享内存)【转】

简述 上一节中,我们分享下如何利用Windows消息机制来进行不同进程间的通信.但是有很多局限性,比如:不能跨平台,而且必须两个进程同时存在才可以,要么进程A发了消息谁接收呢? 下面我们来分享另外一种跨平台的进行间通信的方式-Shared Memory(共享内存). 简述 注意事项 加载进内存 说明 实现 从内存中读取 说明 实现 注意事项 初始化QSharedMemory时,必须指定一个唯一的标识Key,进程的Key必须保持一致.可以使用setKey来设置. 加载进内存 说明 进程A-写 分为

共享内存mmap学习 及与 shmxxx操作的区别

上一篇学习了共享内存: http://www.cnblogs.com/charlesblc/p/6142139.html 根据这个 http://blog.chinaunix.net/uid-26335251-id-3493125.html 再来一篇: 1. 共享内存允许两个或多个进程共享一给定的存储区,因为数据不需要来回复制,所以是最快的一种进程间通信机制.共享内存可以通过mmap()映射普通文件(特殊情况下还可以采用匿名映射)机制实现,也可以通过系统V共享内存机制实现. 应用接口和原理很简单

(转)Linux环境进程间通信系列(五):共享内存

原文地址:http://www.cppblog.com/mydriverc/articles/29741.html 共享内存可以说是最有用的进程间通信方式,也是最快的 IPC 形式.两个不同进程 A . B 共享内存的意思是,同一块物理内存被映射到进程 A . B 各自的进程地址空间.进程 A 可以即时看到进程 B 对共享内存中数据的更新,反之亦然.由于多个进程共享同一块内存区域,必然需要某种同步机制,互斥锁和信号量都可以. 采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接读写内存

boost进程间通信经常使用开发一篇全(消息队列,共享内存,信号)

本文概要: 敏捷开发大家想必知道并且评价甚高,缩短开发周期,提高开发质量.将大project独立为不同的小app开发,整个开发过程,程序可用可測,所以提高了总体的质量.基于这样的开发模式和开发理念,进程间通信必定是童鞋们必掌握技能之中的一个了,而boost库是众多库中平台支持性非常好,效果非常高之中的一个.做嵌入式或者server等应用的人肯定有所涉及.本文以手冊方式讲述boost共享内存,信号,以及消息队列的编程方式.非常easy,列出最经常使用使用方法,供大家拷贝直接使用.本文出自CSDN-

php 共享内存

转:php 共享内存 共享内存主要用于进程间通信 php中的共享内存有两套扩展可以实现 1.shmop  编译时需要开启 --enable-shmop 参数 实例: $shm_key = ftok(__FILE__, 't'); /** 开辟一块共享内存 int $key , string $flags , int $mode , int $size $flags: a:访问只读内存段 c:创建一个新内存段,或者如果该内存段已存在,尝试打开它进行读写 w:可读写的内存段 n:创建一个新内存段,如

Linux --进程间通信--共享内存

一.共享内存 共享内存是最高效的通信方式,因为不需要一个进程先拷贝到内核,另一个进程在存内核中读取. 二. ipcs -m 查看共享内存 ipcrm -m 删除共享内存 三.主要函数 shmget 创建 shmctl 删除 shmat 挂接 shmdt 取消挂接 ********* man 函数名 查看***** 四.代码实现 comm.h   1 #pragma once   2 #include<stdio.h>   3 #include<stdlib.h>   4 #incl

linux共享内存之mmap

这应该可以算得上是IPC的一种,虽然效率可能并没有其它IPC方式高. 看到map很容易联想到映射.的确,mmap就是一种映射方式,将打开的文件和一段连续的内存做映射.使得对内存进行操作即可以实现对文件的读写,反过来,也就是说,可以通过这种方式来达到进程通信. mmap系列涉及三个函数. void * mmap(void *buf, size_t len, int prot, int flag, int fd, off_t offset); 此函数建立一个共享内存,prot即为权限,可选值有PRO

linux 共享内存实现

说起共享内存,一般来说会让人想起下面一些方法:1.多线程.线程之间的内存都是共享的.更确切的说,属于同一进程的线程使用的是同一个地址空间,而不是在不同地址空间之间进行内存共享:2.父子进程间的内存共享.父进程以MAP_SHARED|MAP_ANONYMOUS选项mmap一块匿名内存,fork之后,其子孙进程之间就能共享这块内存.这种共享内存由于受到进程父子关系的限制,一般较少使用:3.mmap文件.多个进程mmap到同一个文件,实际上就是大家在共享文件page cache中的内存.不过文件牵涉到