如何使用的示例代码
    SHARE_MEM_KEY( SHM_KEY_EXAMPLE , 0x12345678 , "SHM_EXAMPLE" )

ShareMemory ShareMem; 
    const size_t SHM_LEN_EXAMPLE = 64 * 1024 * 1024;
    ShareMem.Create( SHM_KEY_EXAMPLE , SHM_LEN_EXAMPLE );
    char * pMemory = ( char * ) ShareMem.Address( );
    memset( pMemory , 0 , SHM_LEN_EXAMPLE );

ShareMemory.h
//==================================================================================================
//                                        Share Memory
//    --------------------------------------------------------------------------------------------
//    int Create( KeyT Key , size_t Length );
//    int Open( KeyT Key , bool Write = false );
//    int Delete( );
//    int Close( );
//    
//    --------------------------------------------------------------------------------------------
//    Universal Studio                            WonKerr                                  2006-03-25
//==================================================================================================

#pragma once

#if defined( _WIN32 )
#    include <windows.h>
#else
#    include <sys/types.h>
#    include <sys/ipc.h>
#    include <sys/shm.h>
#endif

#if defined( _WIN32 )

//==================================================================================================
//    Windows : Share Memory Template
template< typename KeyT > class CShareMem_WinX
{
public:
    CShareMem_WinX( )
    {
        hMapping = NULL;
        pAddress = NULL;
        dwAccess = 0;
    }

~CShareMem_WinX( )
    {
        Delete( );
    }

inline int Create( KeyT Key , size_t Length )
    {
        //    检查参数
        if( NULL != pAddress || NULL != hMapping ) return -1;

//    调整长度为页的整数倍 ( 4096 * N )
        CONST ULONGLONG AlignToPage = 0x00000000000003FF;
        ULONGLONG Length64 = static_cast< ULONGLONG >( Length );
        Length64 = ( ( Length64 + AlignToPage ) & ( ~ AlignToPage ) );

//    创建共享内存,在 64 位中大小可以超过 4 GB 
        HANDLE hFile = static_cast< HANDLE >( INVALID_HANDLE_VALUE );
        DWORD dwSizeLow = static_cast< DWORD >( Length64 & 0xFFFFFFFF );
        DWORD dwSizeHigh = static_cast< DWORD >( ( Length64 >> 32 ) & 0xFFFFFFFF ); 
        hMapping = CreateFileMapping( hFile , NULL , PAGE_READWRITE , dwSizeHigh , dwSizeLow , Key );
        if( hMapping != NULL && GetLastError() == ERROR_ALREADY_EXISTS )
        {
            // 已经存在
            CloseHandle( hMapping );
            hMapping = NULL;
            return -2;
        }
        else if( NULL == hMapping )
        {
            // 创建失败
            return -3;
        }

//    映射内存
        pAddress = MapViewOfFileEx( hMapping , FILE_MAP_ALL_ACCESS , 0 , 0 , Length , 0 );
        if( NULL != pAddress ){ dwAccess = INT_MAX ; return ERROR_SUCCESS; }

CloseHandle( hMapping );
        hMapping = NULL;
        return -4;
    }

inline int Open( KeyT Key , bool Write = false )
    {
        //    检查参数
        if( NULL != pAddress || NULL != hMapping ) return -1;

//    打开共享内存
        dwAccess = Write ? FILE_MAP_ALL_ACCESS : FILE_MAP_READ ;
        hMapping = OpenFileMapping( dwAccess , FALSE , Key );
        if( NULL == hMapping ){ dwAccess = 0 ; return -2; }

//    映射内存
        pAddress = MapViewOfFileEx( hMapping , dwAccess , 0 , 0 , 0 , 0 );
        if( NULL != pAddress ){ dwAccess = INT_MAX ; return ERROR_SUCCESS; }

CloseHandle( hMapping );
        hMapping = NULL;
        return -3;
    }

inline int Delete( )
    {
        //    检查参数
        if( NULL == pAddress || NULL == hMapping ) return -1;

//    删除共享
        UnmapViewOfFile( pAddress );
        CloseHandle( hMapping );
        pAddress = NULL;
        hMapping = 0;
        dwAccess = 0;
        return 0;
    }

inline int Close( )
    {
        return Delete( );
    }

inline void * Address()
    {
        return pAddress;
    }

public:
    static int Exists( KeyT Key )
    {
        CShareMem_WinX< KeyT > ShareMem;
        return ShareMem.Open( Key );
    }

static int Remove( KeyT Key )
    {
        return 0;
    }

protected:
    HANDLE    hMapping;
    LPVOID    pAddress;
    DWORD    dwAccess;
};

//==================================================================================================
//    Define share mem key type & template name
#define SHARE_MEM_KEY_TYPE LPCTSTR
#define SHARE_MEM_TEMPLATE CShareMem_WinX
#define SHARE_MEM_KEY( name , key_1 , key_2 ) SHARE_MEM_KEY_TYPE name = TEXT( key_2 );

#else

//==================================================================================================
//    System V : Share Memory Template
template< typename T > class CShareMem_SysV
{
public;
    CShareMem_SysV( )
    {
        pAddress = NULL;
        hMapping = -1;
        nAccess = 0;
    }

~CShareMem_SysV( )
    {
        Delete( );
    }

public:
    inline int Create( KeyT lpszName , size_t nLength )
    {
        //    Check parameter
        if( NULL != pAddress || -1 != hMapping ) return -1;

//    Get share memory id
        //int iFlags = SHM_R|SHM_W|IPC_CREAT|IPC_EXCL;
        hMapping = shmget( Key , Length , IPC_CREAT );
        if( -1 == hMapping ){ return -2; }

// Set access mode
        //struct shmid_ds shmds;
        //shmctl(hMapping , IPC_STAT , &shmds );
        //shmds.shm_perm.mode |= 0x1B4; /* rw-rw-r-- */
        //shmctl(hMapping , IPC_SET , &shmds );

// Attach share memory
        pAddress = shmat( hMapping , 0 , 0 );
        if( NULL != pAddress )
        {
            nAccess = -1;
            return 0;
        }

//    Remove share memory id
        int hShare = hMapping; hMapping = -1;
        return shmctl( hShare , IPC_RMID , 0 );
    }

inline int Delete( )
    {
        //    Check parameter
        if( NULL == pAddress || -1 == hMapping ) return -1;
        if( -1 != nAccess ) { return Close( ); }

// Detech and remove share memory
        shmdt( pAddress ) ; pAddress = NULL;
        shmctl( hMapping , IPC_RMID , 0 );
        hMapping = -1; nAccess = 0;
        return 0;
    }

inline int Open( KeyT Key , bool Write = false )
    {
        //    Check parameter
        if( NULL != pAddress || -1 != hMapping ) return -1;
    
        //    Open share memory
        nAccess = Write ? SHM_R : SHM_R | SHM_W ;
        hMapping = shmget( Key , 0 , nAccess );
        if( -1 == hMapping ) { return -2; }

//    Attach share memory
        pAddress = shmat( hMapping , 0 , 0 );
        return pAddress ? 0 : -3 ;
    }

inline int Close( )
    {
        //    Check Parameter
        if( NULL == pAddress || -1 == hMapping ) return -1;
        if( -1 == nAccess ) { return Delete( ); }

//    Share memory detech
        void * pAddr = pAddress; pAddress = NULL;
        hMapping = -1; nAccess = 0;
        return shmdt( pAddr );
    }

inline void * Address()
    {
        return (void *)pAddress;
    }

public:
    static int Exists( KeyT Key )
    {
        return shmget( Key , 0 , SHM_R );
    }

static int Remove( KeyT Key )
    {
        int hShare = shmget( Key , 0 , SHM_R | SHM_W );
        if( -1 == hShare ){ return 0; }

return shmctl( hShare , IPC_RMID , 0 );
    }

protected:
    int        nAccess;
    int        hMapping;
    char *    pAddress;
};

//==================================================================================================
//    Define share mem key type & template name
#define SHARE_MEM_KEY_TYPE key_t
#define SHARE_MEM_TEMPLATE CShareMem_SysV
#define SHARE_MEM_KEY( name , key_1 , key_2 ) enum { name = key_1 };

#endif

//==================================================================================================
//    Instance Template Class : ShareMemory
typedef SHARE_MEM_TEMPLATE< SHARE_MEM_KEY_TYPE > ShareMemory;

转载于:https://www.cnblogs.com/WonKerr/archive/2009/03/03/ShareMemory.html

简单小巧的跨平台共享内存代码相关推荐

  1. 【Linux系统编程】进程间通信之共享内存

    00. 目录 文章目录 00. 目录 01. 共享内存概述 02. 共享内存函数 2.1 创建共享内存 2.2 共享内存映射 2.3 共享内存解除映射 2.4 共享内存操作函数 03. 案例实战 04 ...

  2. 世上最好的共享内存(Linux共享内存最透彻的一篇)上集

    共享单车.共享充电宝.共享雨伞,世间的共享有千万种,而我独爱共享内存. 早期的共享内存,着重于强调把同一片内存,map到多个进程的虚拟地址空间(在相应进程找到一个VMA区域),以便于CPU可以在各个进 ...

  3. linux 进程间通信及makefile 无名管道/有名管道/共享内存/信号/消息队列

    http://www.voidcn.com/article/p-hxvuiypm-mr.html https://www.cnblogs.com/wuyida/archive/2013/02/03/6 ...

  4. 宋宝华:世上最好的共享内存(Linux共享内存最透彻的一篇)上集

    共享单车.共享充电宝.共享雨伞,世间的共享有千万种,而我独爱共享内存. 早期的共享内存,着重于强调把同一片内存,map到多个进程的虚拟地址空间(在相应进程找到一个VMA区域),以便于CPU可以在各个进 ...

  5. ZUCC_操作系统实验_Lab7进程通信---共享内存

    lab7进程通信-共享内存 一.利用共享内存实现生产者/消费者问题的解决方案 1.代码 #include<stdio.h> #include<stdlib.h> #includ ...

  6. Linux C 进程间的IPC通信 之 共享内存(二)

    1.父子进程(有亲缘关系)的IPC通信 int shmid;       shmid = shmget(IPC_PRIVATE, 128, IPC_CREAT | 0777); //创建共享内存,参数 ...

  7. 共享内存_shmget

    文章目录 共享内存 创建共享内存 映射共享内存 删除共享内存 父子进程共享内存 共享内存通信 共享内存   共享内存是被多个进程共享的一部分物理内存.一个进程向共享内存写入了数据,共享这个内存区域的所 ...

  8. MFC:通过代码简单理解进程间的通讯机制——共享内存

    下面用共享映射文件的方式实现进程间通信,代码可以运行. 一.浅理解 每个进程有自己独立的空间,一个进程无法访问其他进程的数据.就好像两个是互不干涉的个体,想让它们进行通信(交换数据),就必须有一段它们 ...

  9. 完善博文 共享内存一写多读无锁实现的代码逻辑部分

    使用共享内存(内存映射)实现发布订阅模式 多进程实现PubSub发布订阅模式,从而实现进程间的通信. 通信方式可以是TCP/UDP,管道Pipe/消息队列,共享内存shared memory等等.其中 ...

最新文章

  1. 缓存成神路:Redis读写分离难以理解?一文解析Redis读写分离技术
  2. ASP.NET结合COM组件发送Email
  3. 20145223《信息安全系统设计基础》 GDB调试汇编堆栈过程分析
  4. 用 C 语言开发一门编程语言 — 语法解析器
  5. mvn本地生成jar包放在mvn项目依赖(将jar包传到本地仓库)
  6. 直流UPS与传统UPS系统节能分析
  7. Java8 Lambda 表达式
  8. oracle实现分段,用Oracle分段空间管理功能改进数据库性能
  9. brave浏览器_Brave浏览器基础使用教程,同时如何通过Brave获取BAT奖励
  10. JavaScript/JS的学习
  11. oracle中dbms_DBMS中的实例和架构
  12. 【LeetCode】剑指 Offer 18. 删除链表的节点
  13. SGU 286 Ancient decoration(Euler路径+二分匹配)
  14. 警告: 程序集绑定日志记录被关闭。解决方法
  15. python画图颜色代码_Python-使用matplotlib创建自己的颜色图并绘制颜色比例
  16. 关于AngularJs中$http post、get 发送和接受参数详解
  17. 苹果电脑Mac上怎样实现图像文件格式转换?
  18. Python学习02 列表 List
  19. 压缩包文件密码如何找回
  20. 省公司交流期间一线工作总结

热门文章

  1. 笔记︱多种常见聚类模型以及分群质量评估(聚类注意事项、使用技巧)
  2. Netflix Media Database - 架构设计和实现
  3. 有好事?卡巴斯基推出免费杀毒软件
  4. angularjs内置63个指令
  5. Ubuntu中网络编程的环境配置
  6. 【ZooKeeper Notes 5】单机启动多个zk实例注意点
  7. Switching命令大全
  8. java处理文本的方法
  9. 大数据-数据抽取(数据降维)算法
  10. Matrix67:漫话中文分词算法