zoukankan      html  css  js  c++  java
  • Chapter17— MemoryMapping Files 进程间共享数据进行通信

         第十七章的实例有个利用 Memory-Mapped File 来实现进程间共享数据和通信。

    Step1:调用 CreateFileMapping 函数创建一个 Memory-Mapped File Object。

    该函数的原型如下:

    HANDLE WINAPI CreateFileMapping(
      __in          HANDLE hFile,
      __in          LPSECURITY_ATTRIBUTES lpAttributes,
      __in          DWORD flProtect,
      __in          DWORD dwMaximumSizeHigh,
      __in          DWORD dwMaximumSizeLow,
      __in          LPCTSTR lpName
    );
    
    • 第一个参数 hFile 设为 INVALID_HANDLE_VALUE 表示你仅是将该 Memory-Mapped File Object 存放在 系统的分页文件中,而不是某个指定的磁盘文件当中。
    • 第二个参数 lpAttributes 是安全属性,一般默认是 NULL
    • 第三个参数 flProtect 是指定文件视图的保护属性的。具体的就参考MSDN,下面实例中就使用 PAGE_READWRITE 值,表示有读写权限
    • 第四个参数 dwMaximumSizeHigh ,指定最大文件视图大小中64-bit中的高32位
    • 第五个参数 dwMaximumSizeHigh ,指定最大文件视图大小中64-bit中的低32位
    • 第六个参数 lpName,指定给文件视图的名字。

    Step2:调用 MapViewOfFile 函数将文件视图映射入 进程地址空间。

    该函数的原型如下:

    LPVOID WINAPI MapViewOfFile(
      __in          HANDLE hFileMappingObject,
      __in          DWORD dwDesiredAccess,
      __in          DWORD dwFileOffsetHigh,
      __in          DWORD dwFileOffsetLow,
      __in          SIZE_T dwNumberOfBytesToMap
    );
    

    • 第一个参数 hFileMappingObject 就填入 上面 CreateFileMapping 函数的返回值
    • 第二个参数 dwDesiredAccess ,指定进程的访问权
    • 限,下面实例中使用 FILE_MAP_READ | FILE_MAP_WRITE 表示有读写权限,注意此处的权限不能高于试图文件本身的权限,即第一步中指定的 flProtect 指定的权限。
    • 第三个参数 dwFileOffsetHigh,表示视图文件的偏移量64位中的高 32 位
    • 第四个参数 dwFileOffsetLow,表示视图文件的偏移量64位中的低 32 位
    • 第五个参数 dwNumberOfBytesToMap,表示总有多少个字节被映射入该进程的地址空间

    Step3:读写 mapping file 内容

    第三步中 MapViewOfFile 函数返回一个指针,通过该指针就可以实现对 mapping file 的读写,这样进程间就可以进行通信了。


    Step4:之后调用 UnmapViewOfFile 将Memory-Mapping File 从进程的地址空间中移除


    Step5:最后关闭 Memory-Mapping File 句柄


    运行过程截图如下



    代码示例

    #include <windows.h>
    #include <TCHAR.H>
    #include <stdio.h>
    
    void main()
    {
        int choice;
        HANDLE hFile_Map = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 4 * 1024, TEXT("MMFSharedData"));
    
        if (hFile_Map == NULL)
        {
            printf("Failed to create file mapping!\n");
            getchar();
    
            return;
        }
        else if (GetLastError() == ERROR_ALREADY_EXISTS)
        {
            printf("Mapping already exists - not created.\n");
            getchar();
        }
    
        // File mapping created successfully.
    
        // Map a view of the file into the address space.
        PVOID pView = MapViewOfFile(hFile_Map, FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, 0);
        if (NULL == pView)
        {
            printf("Failed to map view of file.\n");
            getchar();
    
            return;
        }
    
        while (true)
        {
            getchar();
            system("cls");
            printf("\n\t1.写入 mapping file 内容.");
            printf("\n\t2.读取 mapping file 内容.");
            printf("\n\t3.退出程序");
            printf("\n\n请输入你的选择序号:");
            scanf("%d", &choice);
    
            if (choice == 3)
                break;
    
            switch (choice)
            {
            case 1:
                printf("输入要写入的内容:");
                scanf("%s", pView);
                break;
            case 2:
                printf("显示已写入的内容:");
                printf("%s\n", pView);
                break;
            default:
                printf("你的选择序号有误。\n");
                break;
            }
            getchar();
        }
        
        UnmapViewOfFile(pView);
        CloseHandle(hFile_Map);    
    }

    《windows核心编程》(笔记)系列文章是本人看《windows核心编程》时的一些学习笔记,有疏忽之处,欢迎各位网友指正。QQ邮箱:job.zhanghui@qq.com

  • 相关阅读:
    Linux——k8s命令别名修改
    k8s—centos7安装部署NFS服务器和客户端及基于nfs的动态存储storageclass使用总结
    MySQL—用户和权限管控
    MySQL—常用SQL语句整理总结
    Zookeeper——入门介绍(相关原理、安装启动及使用操作)
    SpringBoot——Quartz定时框架的使用详解和总结
    SpringBoot——@Scheduled的自定义周期性线程池解决任务延时执行问题
    Linux—用户新建目录和文件的默认权限设置:umask详解
    设计模式——单例模式详解
    Linux—CPU核数、上下文切换介绍及pidstat等命令详解
  • 原文地址:https://www.cnblogs.com/java20130722/p/3207089.html
Copyright © 2011-2022 走看看