共享内存机制

来源:互联网 发布:武大测绘学院知乎 编辑:程序博客网 时间: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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 血氧饱和度80多怎么办 染发前洗了头发怎么办 剪了短发后悔了怎么办 短发被剪的太短怎么办 短发剪得太短怎么办 烫头发后洗头了怎么办 头发染得太黄了怎么办 烫发后一直掉发怎么办 头发染的太黄了怎么办 头发染色太浅了怎么办 怀孕60天没有胎心怎么办 染了深褐色很黑怎么办 路边停车费没交怎么办 3岁宝宝难入睡怎么办 一上火眼睛就肿怎么办 孩子上火眼睛红有眼屎怎么办 孩子眼屎多又黄怎么办 眼睛皮周围红痒怎么办 新买的拖鞋有味怎么办 毛巾变得滑滑的怎么办 买的挂钩粘不住怎么办 吸墙挂钩吸不住怎么办 沾挂钩不粘了怎么办 粘钩掉了不粘了怎么办 贴墙挂钩粘不住怎么办 月经量大血块多怎么办 23岁乳房小扁平怎么办 十六岁基本没胸怎么办 肚子上的肉松弛怎么办 17岁乳房外扩该怎么办 胸下垂严重怎么办 17岁 棉条超过8小时了怎么办 在学校来了月经怎么办 如果在学校来月经怎么办 来月经流血量大怎么办 非经期出血量多怎么办 在学校来月经了怎么办 月经好久不来了怎么办 例假推迟了20天怎么办 月经晚了13天了怎么办 大姨吗推迟十天怎么办