定义:
共享内存是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问。共享内存是最快的 IPC 方式,它是针对其他进程间通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号两,配合使用,来实现进程间的同步和通信。
一、同一程序多个实例的内存共享
是不是同一程序的多个实例就没办法共享数据了呢,有时这是很有用的!答案是可以共享,通过共享数据段可以很容易的在同一程序的多个实例之间共享数据。
其实.exe或.dll文件分为若干个节(section),例如.text节通常存放程序的代码,.data节存放已初始化的全局变量等等,每个节也都有自己的属性:READ、WRITE、EXECUTE、SHARED。我们可以自己创建一个节,并指定SHARED属性(当然通常还要有READ、WRITE属性,否则没有什么意义了),这样,编译程序时就会自动生成该节,包含在该节中的内容将被该程序的多个进程所共享。
代码如下:
#pragma data_seg(".shared")
int Idata = 0;
char data[4096]={0};
float fdata = 0.0;; // 必须是初始化的,否则放到.shared之外
#pragma data_seg()
#pragma comment(linker, "/SECTION:.shared,RWS")
__declspec(allocate(".shared")) int g_nforce; // 强制把 nforce 放入 .shared节中,无论它是否被初始化,很暴力哦
二、不同进程间的内存共享
1、创建共享内存
if (NULL != m_hMapFile)
CloseHandle(m_hMapFile);//如果内存镜像文件句柄已经创建成功,则先关闭它
m_hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, //物理文件句柄
NULL, //安全设置
PAGE_READWRITE, //保护设置
0, //高位文件大小
nBufSize, //低位文件大小
MAP_NAME); //共享内存名称
if (m_hMapFile == NULL)
{
AfxMessageBox("创建共享内存失败");
return;
}
2、共享内存写入
if (NULL == m_hMapFile)
{
AfxMessageBox("打开内存镜像文件句柄失败!");
return;
}
CString strtext;
GetDlgItemText(IDC_EDIT1, strtext);
LPVOID lpShareMemory;
lpShareMemory = MapViewOfFile(m_hMapFile, FILE_MAP_ALL_ACCESS, 0, 0, 0);
memcpy_s(lpShareMemory, strtext.GetLength(), strtext, strtext.GetLength());
UnmapViewOfFile(lpShareMemory);
3、共享内存读取
HANDLE hFileMapping;
LPVOID lpShareMemory;
hFileMapping = OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, (LPCSTR)MAP_NAME);
if (NULL == hFileMapping)
{
AfxMessageBox("打开内存镜像文件句柄失败!");
return;
}
lpShareMemory = MapViewOfFile(hFileMapping, FILE_MAP_ALL_ACCESS, 0, 0, 0);
char *a = (char*)lpShareMemory;
CString str;
str.Format("读取到的数据为:%s", a);
AfxMessageBox(str);
全部代码:
https://download.csdn.net/download/qq_25359343/11460743
参考资料:
https://www.cnblogs.com/yoran/archive/2008/03/02/1088084.html