C++ 进程间共享内存实现

来源:互联网 发布:知商金融 红包 编辑:程序博客网 时间:2024/05/21 19:22

原文地址:
http://blog.csdn.net/tojohnonly/article/details/70246965

共享内存 (也叫内存映射文件) 主要是通过映射机制实现的 , Windows 下进程的地址空间在逻辑上是相互隔离的 , 但在物理上却是重叠的 ; 所谓的重叠是指同一块内存区域可能被多个进程同时使用 , 当调用 CreateFileMapping 创建命名的内存映射文件对象时 , Windows 即在物理内存申请一块指定大小的内存区域 , 返回文件映射对象的句柄 hMap ; 为了能够访问这块内存区域必须调用 MapViewOfFile 函数 , 促使 Windows 将此内存空间映射到进程的地址空间中 ; 当在其他进程访问这块内存区域时 , 则必须使用 OpenFileMapping 函数取得对象句柄 hMap , 并调用 MapViewOfFile 函数得到此内存空间的一个映射 , 这样系统就把同一块内存区域映射到了不同进程的地址空间中 , 从而达到共享内存的目的 , 代码如下 :
第一步:
先建一个控制台程序,ShareMemory_create.cpp,用于创建共享内存,代码如下:

// ShareMemory_Create.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <windows.h>using namespace std;#define BUF_SIZE 4096int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]){    // 定义共享数据    char szBuffer[] = "Hello Shared Memory";    // 创建共享文件句柄     HANDLE hMapFile = CreateFileMapping(        INVALID_HANDLE_VALUE,   // 物理文件句柄        NULL,   // 默认安全级别        PAGE_READWRITE,   // 可读可写        0,   // 高位文件大小        BUF_SIZE,   // 地位文件大小        L"ShareMemory"   // 共享内存名称        );    // 映射缓存区视图 , 得到指向共享内存的指针    LPVOID lpBase = MapViewOfFile(        hMapFile,            // 共享内存的句柄        FILE_MAP_ALL_ACCESS, // 可读写许可        0,        0,        BUF_SIZE        );    // 将数据拷贝到共享内存    strcpy((char*)lpBase,szBuffer);    // 线程挂起等其他线程读取数据    Sleep(2000000);    // 解除文件映射    UnmapViewOfFile(lpBase);    // 关闭内存映射文件对象句柄    CloseHandle(hMapFile);    system("pause");    return 0;}

第二步:
再建一个控制台程序,ShareMemory_read.cpp用于读取共享内存数据,代码如下:

// ShareMemory_Read.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include <iostream>  #include <windows.h>  using namespace std;  #define BUF_SIZE 4096int main()  {      // 打开共享的文件对象    HANDLE hMapFile = OpenFileMapping(FILE_MAP_ALL_ACCESS,NULL,L"ShareMemory");    if (hMapFile)    {        LPVOID lpBase = MapViewOfFile(hMapFile,FILE_MAP_ALL_ACCESS,0,0,0);        // 将共享内存数据拷贝出来        char szBuffer[BUF_SIZE] = {0};        strcpy(szBuffer,(char*)lpBase);        printf("%s",szBuffer);        // 解除文件映射        UnmapViewOfFile(lpBase);        // 关闭内存映射文件对象句柄        CloseHandle(hMapFile);    }    else    {        // 打开共享内存句柄失败        printf("OpenMapping Error");    }    system("pause");    return 0;}
原创粉丝点击