zoukankan      html  css  js  c++  java
  • 共享内存的申请和释放

    1.通过映射来申请内存

    物理页可以在多个进程中共享;

    CreateFileMapping函数用于创建一个文件映射内核对象

    HANDLE CreateFileMapping(
      HANDLE hFile,                       //物理文件句柄
      LPSECURITY_ATTRIBUTES lpAttributes, //安全设置
      DWORD flProtect,                    //保护设置
      DWORD dwMaximumSizeHigh,            //高位文件大小
      DWORD dwMaximumSizeLow,             //低位文件大小
      LPCTSTR lpName                      //共享内存名称
    );

    MapViewOfFile是计算机函数,功能是将一个文件映射对象映射到当前应用程序的地址空间。MapViewOfFileEx允许我们指定一个基本地址来进行映射。

    LPVOID WINAPI MapViewOfFile(
      __in HANDLE hFileMappingObject,  // 为CreateFileMapping()返回的文件映像对象句柄。
      __in DWORD dwDesiredAccess,   //映射对象的文件数据的访问方式
      __in DWORD dwFileOffsetHigh,  //表示文件映射起始偏移的高32位.
      __in DWORD dwFileOffsetLow,  //表示文件映射起始偏移的低32位.(64KB对齐不是必须的)
      __in SIZE_T dwNumberOfBytesToMap   //指定映射文件的字节数.
      );

    需要和

    //关闭映射
    UnmapViewOfFile(g_lpBuff); 

    配套使用;

     1 // 共享内存的申请.cpp : 定义控制台应用程序的入口点。
     2 //
     3 
     4 #include "stdafx.h"
     5 #include <windows.h>
     6 #define MapFileName "共享内存"
     7 #define BUF_SIZE 0x1000
     8 
     9 HANDLE g_hMapFile;
    10 LPTSTR g_lpBuff;
    11 
    12 int main()
    13 {
    14     getchar();
    15     //内核对象:物理页,准备好物理页还没建立关联
    16     g_hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, BUF_SIZE,(LPCWSTR) MapFileName);
    17     //将物理页与线性地址进行映射,进行关联
    18     //映射时候如果创建的物理页只读,但是映射时权限设置成可写,则函数失败
    19     g_lpBuff = (LPTSTR)MapViewOfFile(g_hMapFile, FILE_MAP_WRITE, 0, 0, BUF_SIZE);
    20 
    21     
    22     
    23     *(PDWORD)g_lpBuff = 0x12345678;
    24     printf("%p", g_lpBuff);
    25     
    26     getchar();
    27 
    28     //关闭映射
    29     UnmapViewOfFile(g_lpBuff);
    30     //关闭句柄
    31     CloseHandle(g_hMapFile);
    32     getchar();
    33 
    34     return 0;
    35 }
  • 相关阅读:
    windows系统下强制杀死某个进程
    onenote快捷键
    sublime封装代码块快捷键、eemet插件安装、Loading PyV8 binary...的解决办法
    google浏览器截长图的方法
    (转)Java基础加强之并发(二)常用的多线程实现方式
    hibernate学习(初识)
    Spring中的事务操作
    JDBC最原始的代码做查询操作
    Spring的JDBC模板
    Spring AOP
  • 原文地址:https://www.cnblogs.com/hanhandaren/p/11146257.html
Copyright © 2011-2022 走看看