共享内存机制
来源:互联网 发布:武大测绘学院知乎 编辑:程序博客网 时间:2024/06/09 17:17
共享内存主要是通过映射机制实现的。
Windows 下进程的地址空间在逻辑上是相互隔离的,但在物理上却是重叠的。所谓的重叠是指同一块内存区域可能被多个进程同时使用。当调用CreateFileMapping 创建命名的内存映射文件对象时,Windows 即在物理内存申请一块指定大小的内存区域,返回文件映射对象的句柄 hMap。为了能够访问这块内存区域必须调用 MapViewOfFile 函数,促使 Windows 将此内存空间映射到进程的地址空间中。当在其他进程访问这块内存区域时,则必须使用OpenFileMapping 函数取得对象句柄 hMap,并调用MapViewOfFile 函数得到此内存空间的一个映射。这样一来,系统就把同一块内存区域映射到了不同进程的地址空间中,从而达到共享内存的目的。
***************************************************
共享内存实例一
#include <windows.h>#include <iostream>#include <string>#include <cstring>using namespace std;int main(){string strMapName("ShareMemory"); // 内存映射对象名称string strComData("This is common data!"); // 共享内存中的数据LPVOID pBuffer; // 共享内存指针// 首先试图打开一个命名的内存映射文件对象 HANDLE hMap = ::OpenFileMapping(FILE_MAP_ALL_ACCESS, 0, strMapName.c_str());if (NULL == hMap){ // 打开失败,创建之 hMap = ::CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, strComData.length()+1, strMapName.c_str()); // 映射对象的一个视图,得到指向共享内存的指针,设置里面的数据 pBuffer = ::MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0); strcpy((char*)pBuffer, strComData.c_str()); cout << "写入共享内存数据:" << (char *)pBuffer << endl;}else{ // 打开成功,映射对象的一个视图,得到指向共享内存的指针,显示出里面的数据 pBuffer = ::MapViewOfFile(hMap, FILE_MAP_ALL_ACCESS, 0, 0, 0); cout << "读取共享内存数据:" << (char *)pBuffer << endl;}getchar(); // 注意,进程关闭后,所有句柄自动关闭,所以要在这里暂停// 解除文件映射,关闭内存映射文件对象句柄::UnmapViewOfFile(pBuffer);::CloseHandle(hMap);system("pause"); return 0;
}
************************************************
共享内存实例二
//a.cpp
#include <windows.h>#include <string.h>#include <string>#include <iostream>#include <tchar.h>using namespace std;#define BUF_SIZE 256TCHAR szName[]=TEXT("Global\\MyFileMappingObject"); //指向同一块共享内存的名字int main(int argc, char *argv[]){HANDLE hMapFile;LPCTSTR pBuf;hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE, // use paging file NULL, // default security PAGE_READWRITE, // read/write access 0, // maximum object size (high-order DWORD) BUF_SIZE, // maximum object size (low-order DWORD) szName); // name of mapping objectif (hMapFile == NULL){ _tprintf(TEXT("Could not create file mapping object (%d).\n"), GetLastError()); return 1;}pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object FILE_MAP_ALL_ACCESS, // read/write permission 0, 0, BUF_SIZE);if (pBuf == NULL){ _tprintf(TEXT("Could not map view of file (%d).\n"), GetLastError()); CloseHandle(hMapFile); return 1;}//从main开始至此,A B process代码一样,都是获取名为"Global\\MyFileMappingObject"的共享内存的指针//以下代码,A不停地读共享内存pBufwhile(1){ cout<<pBuf<<endl; cout<<"A process: hit keyboard to receive from B process"<<endl; getchar();}UnmapViewOfFile(pBuf);CloseHandle(hMapFile);return 0;}
//b.cpp
#include <iostream>#include <Windows.h>#include <tchar.h>using namespace std;#define BUF_SIZE 256TCHAR szName[]=TEXT("Global\\MyFileMappingObject"); //指向同一块共享内存的名字int main(){HANDLE hMapFile;LPCTSTR pBuf;hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE, // use paging file NULL, // default security PAGE_READWRITE, // read/write access 0, // maximum object size (high-order DWORD) BUF_SIZE, // maximum object size (low-order DWORD) szName); // name of mapping objectif (hMapFile == NULL){ _tprintf(TEXT("Could not create file mapping object (%d).\n"), GetLastError()); return 1;}pBuf = (LPTSTR) MapViewOfFile(hMapFile, // handle to map object FILE_MAP_ALL_ACCESS, // read/write permission 0, 0, BUF_SIZE);if (pBuf == NULL){ _tprintf(TEXT("Could not map view of file (%d).\n"), GetLastError()); CloseHandle(hMapFile); return 1;}//从main开始至此,A B process代码一样,都是获取名为"Global\\MyFileMappingObject"的共享内存的指针//以下代码,B不停写共享内存pBufwhile(1){ TCHAR s[BUF_SIZE]; cout<<"B process: plz input sth. to be transfered to A process."<<endl; cin>>s; memcpy((PVOID)pBuf, s, BUF_SIZE);}}
0 0
- Linux共享内存机制
- 共享内存机制
- 内存共享机制
- linux ipc机制-共享内存
- IPC机制---共享内存编程
- 深入理解共享内存机制
- 使用内存共享机制进程间通讯
- 信号机制、共享内存和消息队列
- 信号机制、共享内存和消息队列
- SurfaceFlinger GraphicBuffer内存共享缓冲区机制
- java 栈内存的共享机制
- 【转】SurfaceFlinger GraphicBuffer内存共享缓冲区机制
- Linux中IPC机制:共享内存区
- 基于mmap/munmap内存共享映射机制
- 使用内存共享机制进程间通讯
- Linux进程间共享内存机制
- SurfaceFlinger GraphicBuffer内存共享缓冲区机制
- 关于Java的共享内存机制
- 利用socket发送邮件
- Hadoop的hadoop-config.sh脚本详解
- 树莓派摄像头模块应用程序文档翻译[转]
- ORACLE 12C ——02 CDB 与 PDB 管理
- Xcode7 UI自动化测试详解 带demo UITests
- 共享内存机制
- 提示框第三方库之MBProgressHUD iOS toast效果 动态提示框效果
- boost生成库的命名规则
- 第13周、项目—验证算法 (1)
- AutoLayout 实现固定宽度动态高度的 ScrollView
- mysql 普通表转分区表
- 完美主义:实现iOS输入框自动移动
- iOS使用GData对webService进行解析xml
- Storyboard References