VS2015共享内存

一、写内存端代码:

 1. 创建共享内存 
    hMapFile = CreateFileMapping(
        INVALID_HANDLE_VALUE,    // 匿名共享内存(仅用名称标识)
        NULL,                                      // 默认安全属性
        PAGE_READWRITE,              // 读写权限
        0,                                             // 高32位大小(0)
        SHARED_MEM_SIZE,           // 低32位大小(1025字节)
        _T("TestSharedMem")            // 共享内存名称(全局唯一)
    );

2. 映射共享内存到当前进程地址空间     
    pBuf = MapViewOfFile(
        hMapFile,                                 // 共享内存句柄
        FILE_MAP_ALL_ACCESS,     // 读写权限
        0, 0,                                         // 偏移量(0)
        SHARED_MEM_SIZE            // 映射大小(与创建大小一致)
    );

3. 写入数据,初始化标志位置0(未读取) 
    *(char*)((BYTE*)pBuf + FLAG_OFFSET) = FLAG_UNREAD;  // 标志位初始化
    _tcscpy((TCHAR*)((BYTE*)pBuf + DATA_OFFSET), szData); // 写入数据   

 4. 等待读程序读取(轮询标志位)          

while (*(char*)((BYTE*)pBuf + FLAG_OFFSET) != FLAG_READ)   

 {         Sleep(100);  // 每100ms轮询一次,减少CPU占用     }     

5. 清理资源     

UnmapViewOfFile(pBuf);
CloseHandle(hMapFile);

二、读内存端代码:

1. 打开已创建的共享内存(名称必须与写程序一致)

     hMapFile = OpenFileMapping(
        FILE_MAP_ALL_ACCESS,          // 读写权限
        FALSE,                                         // 不继承句柄
        _T("TestSharedMem")                  // 共享内存名称(与写程序一致)
    );

2. 映射共享内存到当前进程

     pBuf = MapViewOfFile(
        hMapFile,
        FILE_MAP_ALL_ACCESS,
        0, 0,
        SHARED_MEM_SIZE          // 必须与写程序的1025字节一致
    );

3. 读取数据(跳过标志位)

       TCHAR* szData = (TCHAR*)((BYTE*)pBuf + DATA_OFFSET);

  4. 设置标志位为1,通知写程序

       *(char*)((BYTE*)pBuf + FLAG_OFFSET) = FLAG_READ;     

   5. 清理资源

      UnmapViewOfFile(pBuf);
      CloseHandle(hMapFile);

示例代码参考:download.csdn.net/download/qq_34492056/93094280?spm=1001.2014.3001.5503

先运行写端代码,再运行读端代码,运行结果如下图:

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐