zoukankan      html  css  js  c++  java
  • 【IPC进程间通讯之三】内存映射文件Mapping File

    IPC进程间通信+共享内存Mapping

          
            IPC(Inter-Process Communication。进程间通信)。
            文件映射(Mapping)是一种将文件内容映射到内存地址的技术,通过对映射内存,读写文件如同读写内存一般简单。

           多个进程映射同一个文件映射对象,也即多个进程映射到同一个物理存储页面,因此。当一个进程向映射内存写入数据时,其它进程能够通过映射内存读取数据。通过这个机制实现进程间通信。

             
           1.内存文件映射Mapping File :

             A进程创建一个命名的Mapping对象,并在映射内存中写入须要共享的数据。B进程通过对象名打开Mapping对象,映射该Mapping对象。从映射内存中读取数据。

           2.基本API函数 :
    建Mapping对象:
            HANDLE    CreateFileMapping(
                               
    HANDLE      hFile,                                   //物理文件句柄
                               
    LPSECURITY_ATTRIBUTES    lpAttributes, //安全设置
                             
     DWORD      flProtect,                                      //保护设置
                               
    DWORD      dwMaximumSizeHigh,         //高位文件大小
                             
     DWORD      dwMaximumSizeLow,          //低位文件大小
                               
    LPCTSTR   lpName                                   //共享内存名称
    );
            该函数返回创建的Mapping对象。

    创建映射内存:
            LPVOID  MapViewOfFile(
                          HANDLE    hFileMappingObject,               //Mapping对象
                             DWORD     dwDesiredAccess,                        //存取类别
                             DWORD     dwFileOffsetHigh,                  //映射文件高位
                             DWORD     dwFileOffsetLow,                    //映射文件地位
                             SIZE_T        dwNumberOfBytesToMap       //映射字节数
    );
            该函数用于创建Mapping对象的映射内存,返回映射内存。

    内存复制
            VOID  CopyMemory(
                        PVOID Destination,                //要复制内存块的目的地址
                        CONST VOID *Source,              //要复制内存块的源地址
                        SIZE_T Length                                          //复制的字节数
    );
           该函数用于将数据拷贝到映射内存。

    打开Mapping对象:
           HANDLE  OpenFileMapping(
                             DWORD   dwDesiredAccess ,   // 存取权限
                             BOOL       bInheritHandle ,       //继承设置,一般设为FALSE
                             LPCTSTR    lpName                  // Mapping对象名
    );
          该函数用于打开一个存在的Mapping对象。返回Mapping对象句柄。
      
           3.牛刀小试:
         先在VC6.0中执行process1程序。在执行process2程序:

             执行效果:

    process1程序:
    process2 程序:



  • 相关阅读:
    【T-SQL】分布抽取部分数据
    【Tip】如何让引用的dll随附的xml注释文档、pdb调试库等文件不出现在项目输出目录中
    【手记】F5调试报"由于缺少调试目标xxx无法开始调试xxx设置OutputPath和AssemblyName"
    【手记】未能从程序集System.Net.Http.Formatting中加载类型System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter
    摄影基础知识入门
    测试开发进阶必备(附源码)---Dubbo 接口测试技术
    App自动化之dom结构和元素定位方式的详细内容(不看后悔)
    接口自动化测试 | JsonPath 与 Mustache 请求传参的模板化技术
    一文搞定自动化测试框架 RESTAssured 实践(三):对 Response 结果导出
    一文搞定 REST Assured 实践(二):断言实现
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/7072401.html
Copyright © 2011-2022 走看看