转载请注明来源:https://www.cnblogs.com/hookjc/

C++使用共享内存实现进程间通信
文件映射是一种实现进程间单向或双向通信的机制。它允许两个或多个本地进程间相互通信。为了共享文件或内存,所有的进程必须使用相同的文件映射的名字或是句柄。
为了实现共享文件,第一个进程先调用CreateFile方法。接下来调用CreateFileMapping方法来创建一个文件映射对象。并为文件映射指明一个句柄和名称。由于事件,信号,互斥对象和文件映射等这些内核对象都共享同一个名字空间,所以如果这个名字和其他一个对象的名称重名的话那么将创建失败。
为了实现共享内存,进程应首先调用CreateFileMapping函数然后在hFile参数中传入INVALID_HANDLE_VALUE宏来替代句柄。相应的文件映射对象会从系统的分页文件中获得一段内存。如果hFile参数的值是INVALID_HANDLE_VALUE,那么你在调用CreateFileMapping时必须给共享内存指定一个大小值。
使用共享内存或文件的进程必须使用MapViewOfFile函数或MapViewOfFileEx函数来创建一个文件视图。
下面我们创建一个名称为"Local\SampleMap"的文件映射对象,并将一个字符串写入到文件映射中。
我们将创建两个程序,一个是服务程序,一个是客户程序。服务程序负责创建文件映射。
服务程序命名为CppFileMappingServer,它的执行过程是
1.创建一个特定大小的文件映射对象,名称为“Local\SampleMap”
2.将这个对象的文件视图映射到进程的地址空间,然后向视图中写入字符串。

接下来执行客户程序CppFileMappingClient,它首先打开这个名称为“Local\SampleMap”的文件映射对象。然后把相同的文件映射视图映射到自己的地址空间中。然后从视图中读取服务进程所写入的数据。

Server完整源码:

  1. #pragma region Includes
  2. #include <stdio.h>
  3. #include <windows.h>
  4. #pragma endregion
  5. #define MAP_PREFIX          L"Local\\"
  6. #define MAP_NAME            L"SampleMap"
  7. #define FULL_MAP_NAME       MAP_PREFIX MAP_NAME
  8. // Max size of the file mapping object.
  9. #define MAP_SIZE            65536
  10. // File offset where the view is to begin.
  11. #define VIEW_OFFSET         0
  12. // The number of bytes of a file mapping to map to the view. All bytes of the
  13. // view must be within the maximum size of the file mapping object (MAP_SIZE).
  14. // If VIEW_SIZE is 0, the mapping extends from the offset (VIEW_OFFSET) to
  15. // the end of the file mapping.
  16. #define VIEW_SIZE           1024
  17. // Unicode string message to be written to the mapped view. Its size in byte
  18. // must be less than the view size (VIEW_SIZE).
  19. #define MESSAGE             L"Message from the first process."
  20. int wmain(int argc, wchar_t* argv[])
  21. {
  22. HANDLE hMapFile = NULL;
  23. PVOID pView = NULL;
  24. // Create the file mapping object.
  25. hMapFile = CreateFileMapping(
  26. INVALID_HANDLE_VALUE,   // Use paging file - shared memory
  27. NULL,                   // Default security attributes
  28. PAGE_READWRITE,         // Allow read and write access
  29. 0,                      // High-order DWORD of file mapping max size
  30. MAP_SIZE,               // Low-order DWORD of file mapping max size
  31. FULL_MAP_NAME           // Name of the file mapping object
  32. );
  33. if (hMapFile == NULL)
  34. {
  35. wprintf(L"CreateFileMapping failed w/err 0x%08lx\n", GetLastError());
  36. goto Cleanup;
  37. }
  38. wprintf(L"The file mapping (%s) is created\n", FULL_MAP_NAME);
  39. // Map a view of the file mapping into the address space of the current
  40. // process.
  41. pView = MapViewOfFile(
  42. hMapFile,               // Handle of the map object
  43. FILE_MAP_ALL_ACCESS,    // Read and write access
  44. 0,                      // High-order DWORD of the file offset
  45. VIEW_OFFSET,            // Low-order DWORD of the file offset
  46. VIEW_SIZE               // The number of bytes to map to view
  47. );
  48. if (pView == NULL)
  49. {
  50. wprintf(L"MapViewOfFile failed w/err 0x%08lx\n", GetLastError());
  51. goto Cleanup;
  52. }
  53. wprintf(L"The file view is mapped\n");
  54. // Prepare a message to be written to the view.
  55. PWSTR pszMessage = MESSAGE;
  56. DWORD cbMessage = (wcslen(pszMessage) + 1) * sizeof(*pszMessage);
  57. // Write the message to the view.
  58. memcpy_s(pView, VIEW_SIZE, pszMessage, cbMessage);
  59. wprintf(L"This message is written to the view:\n\"%s\"\n",
  60. pszMessage);
  61. // Wait to clean up resources and stop the process.
  62. wprintf(L"Press ENTER to clean up resources and quit");
  63. getchar();
  64. Cleanup:
  65. if (hMapFile)
  66. {
  67. if (pView)
  68. {
  69. // Unmap the file view.
  70. UnmapViewOfFile(pView);
  71. pView = NULL;
  72. }
  73. // Close the file mapping object.
  74. CloseHandle(hMapFile);
  75. hMapFile = NULL;
  76. }
  77. return 0;
  78. }

Client完整源码

  1. #pragma region Includes
  2. #include <stdio.h>
  3. #include <windows.h>
  4. #pragma endregion
  5. #define MAP_PREFIX          L"Local\\"
  6. #define MAP_NAME            L"SampleMap"
  7. #define FULL_MAP_NAME       MAP_PREFIX MAP_NAME
  8. // File offset where the view is to begin.
  9. #define VIEW_OFFSET         0
  10. // The number of bytes of a file mapping to map to the view. All bytes of the
  11. // view must be within the maximum size of the file mapping object. If
  12. // VIEW_SIZE is 0, the mapping extends from the offset (VIEW_OFFSET) to the
  13. // end of the file mapping.
  14. #define VIEW_SIZE           1024
  15. int wmain(int argc, wchar_t* argv[])
  16. {
  17. HANDLE hMapFile = NULL;
  18. PVOID pView = NULL;
  19. // Try to open the named file mapping identified by the map name.
  20. hMapFile = OpenFileMapping(
  21. FILE_MAP_READ,          // Read access
  22. FALSE,                  // Do not inherit the name
  23. FULL_MAP_NAME           // File mapping name
  24. );
  25. if (hMapFile == NULL)
  26. {
  27. wprintf(L"OpenFileMapping failed w/err 0x%08lx\n", GetLastError());
  28. goto Cleanup;
  29. }
  30. wprintf(L"The file mapping (%s) is opened\n", FULL_MAP_NAME);
  31. // Map a view of the file mapping into the address space of the current
  32. // process.
  33. pView = MapViewOfFile(
  34. hMapFile,               // Handle of the map object
  35. FILE_MAP_READ,          // Read access
  36. 0,                      // High-order DWORD of the file offset
  37. VIEW_OFFSET,            // Low-order DWORD of the file offset
  38. VIEW_SIZE               // The number of bytes to map to view
  39. );
  40. if (pView == NULL)
  41. {
  42. wprintf(L"MapViewOfFile failed w/err 0x%08lx\n", GetLastError());
  43. goto Cleanup;
  44. }
  45. wprintf(L"The file view is mapped\n");
  46. // Read and display the content in view.
  47. wprintf(L"Read from the file mapping:\n\"%s\"\n", (PWSTR)pView);
  48. // Wait to clean up resources and stop the process.
  49. wprintf(L"Press ENTER to clean up resources and quit");
  50. getchar();
  51. Cleanup:
  52. if (hMapFile)
  53. {
  54. if (pView)
  55. {
  56. // Unmap the file view.
  57. UnmapViewOfFile(pView);
  58. pView = NULL;
  59. }
  60. // Close the file mapping object.
  61. CloseHandle(hMapFile);
  62. hMapFile = NULL;
  63. }
  64. return 0;
  65. }

运行效果:

Server


Client

来源:python脚本自动迁移

Window 共享内存的更多相关文章

  1. [转]WINDOW进程间数据通讯以及共享内存

    1.引言 在Windows程序中,各个进程之间常常需要交换数据,进行数据通讯.WIN32 API提供了许多函数使我们能够方便高效地进行进程间的通讯,通过这些函数我们可以控制不同进程间的数据交换,就如同 ...

  2. Fresco内存机制(Ashmem匿名共享内存)

    Fresco的内存机制 Fresco是Facebook出品的高性能图片加载库,采用了Ashmem匿名共享内存机制, 来解决图片加载中的OOM问题.这里不对Fresco做深入分析,只关注Fresco在A ...

  3. C扩展 从共享内存shm到memcache外部内存

    引言 - ipc - shm 共享内存 本文会通过案例了解ipc 的共享内存机制使用, 后面会讲解C 如何使用外部内存服务memcached. 好先开始了解 linux 共享内存机制. 推荐先参看下面 ...

  4. Codesys 使用共享内存 打通通讯

    Codesys V3.5 平台   提供了库SysShm,其中包含了共享内存操作的接口函数: SysSharedMemoryClose; SysSharedMemoryCreate; SysShare ...

  5. Linux 共享内存详解一

    共享内存段被多个进程附加的时候,如果不是所有进程都已经调用shmdt,那么删除该共享内存段时,会出现一个临时的不完整的共享内存段(key值是0),无法彻底删除.只有当所有进程都调用shmdt,这个临时 ...

  6. PHP进程通信基础——信号量+共享内存通信

    PHP进程通信基础--信号量+共享内存通信 由于进程之间谁先执行并不确定,这取决于内核的进程调度算法,其中比较复杂.由此有可能多进程在相同的时间内同时访问共享内存,从而造成不可预料的错误.信号量这个名 ...

  7. C++ 共享内存 函数封装

    #pragma once #include <string> #include <wtypes.h> #include <map> using namespace ...

  8. Linux学习笔记(14)-进程通信|共享内存

    在Linux中,共享内存是允许两个不相关的进程访问同一个逻辑内存的进程间通信方法,是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式. 不同进程之间共享的内存通常安排为同一段物理内存.进程可 ...

  9. linux 共享内存 shmat,shmget,shmdt,shmctl

    shmget int shmget(key_t key, size_t size, int flag);//开辟一段共享内存 key_t key :标识符的规则() size_t size :共享内存 ...

随机推荐

  1. Java初学者作业——编写 Java 程序,定义 Java 类 (Point) 用来表示坐标,坐标范围在(0,0)到(100,100)以内,并显示合法的坐标在控制台。

    返回本章节 返回作业目录 需求说明: 编写 Java 程序,定义 Java 类 Point 用来表示坐标,坐标范围在(0,0)到(100,100)以内,并显示合法的坐标在控制台. 实现思路: 定义 P ...

  2. 《MySQL数据操作与查询》- 综合项目 - 学生管理系统

    <MySQL数据操作与查询>综合项目需求 一.系统整体功能 维护学生信息.老师信息和成绩信息. 支持按多种条件组合查询学生信息和成绩信息. 二.系统的信息需求 一个班级有一个讲师一个班主任 ...

  3. 深入浏览器工作原理和JS引擎(V8引擎为例)

    浏览器工作原理和JS引擎 1.浏览器工作原理 在浏览器中输入查找内容,浏览器是怎样将页面加载出来的?以及JavaScript代码在浏览器中是如何被执行的? 大概流程可观察以下图: 首先,用户在浏览器搜 ...

  4. CF786C Till I Collapse

    题目分析 首先,对于这道题,可以用贪心以一个\(O(n)\)的复杂度求解一个\(k\)的值 暴力是\(O(n^2)\)的复杂度,当然过不了. 我们手推一下样例,会发现,答案满足单调性,于是,果断想到二 ...

  5. [ flask ] flask-restful 实现嵌套的有关系的输出字段

    问题描述: 1. 先说明数据关系:有用户,和菜谱.一个用户可以拥有多个菜谱:一对多的关系 2.  resources/users.py 的输出字段: user_fields = { 'id':fiel ...

  6. PowerShell 教程

    随笔分类 - 教程 转载自:https://www.cnblogs.com/XiaoCY/category/1065141.html PowerShell 管道符之Where-Object的使用方法 ...

  7. [ SQLAlchemy ] 关于dynamic的“一知半解”

    问题提出: 1.粉丝机制 2.评论的点赞功能 这两个功能分别由User类和Comment类来实现,同样定义了多对多的关系,查询的时候用的方法却大不一样,先看看代码吧. ### # User类的中间表 ...

  8. Centos 7.6关闭selinux

    查看selinux状态 [root@localhost ~]# sestatus SELinux status: enabled SELinuxfs mount: /sys/fs/selinux SE ...

  9. 灵雀云开源网络插件Kube-OVN 1.4.0 版发布!支持跨集群容器网络、NetworkPolicy 日志

    从 1.4 开始 Kube-OVN 支持将多个 Kubernetes 集群容器网络打通,不同集群之间的 Pod 可以通过 Pod IP 直接互相通信.本版本还支持 ACL 日志,可以记录因 Netwo ...

  10. AI系统——机器学习和深度学习算法流程

    终于考上人工智能的研究僧啦,不知道机器学习和深度学习有啥区别,感觉一切都是深度学习 挖槽,听说学长已经调了10个月的参数准备发有2000亿参数的T9开天霹雳模型,我要调参发T10准备拿个Best Pa ...