转载请注明来源: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脚本自动迁移

最新文章

  1. ExtJS4插件EditArea
  2. Java虚拟机详解03----常用JVM配置参数
  3. [CareerCup] 4.4 Create List at Each Depth of Binary Tree 二叉树的各层创建链表
  4. redis配置文件解析
  5. 使ViewStub 来提高UI的加载的性能
  6. splay学习笔记
  7. Unity3d 获取屏幕depth与normal
  8. 不是技术牛人,如何拿到国内IT巨头的Offer(1)
  9. 【浏览器那些基础】Android平台有那些CPU类型
  10. iOS开发常识
  11. leetcode dfs Validate Binary Search Tree
  12. iOS获取程序运行平台
  13. 《shell脚本学习指南》学习笔记之入门
  14. 用js来实现那些数据结构—目录
  15. php原生代码实现explode函数功能
  16. 修改openstack用户配额
  17. Django之模板
  18. 在MySQL中快速的插入大量测试数据
  19. 【LOJ#6374】网格(二项式反演,容斥)
  20. 号称简明实用的django上手教程

热门文章

  1. VUE3 之 循环渲染
  2. 编写Java程序,模拟教练员和运动员出国比赛场景,其中运动员包括乒乓球运动员和篮球运动员。教练员包括乒乓球教练和篮球教练。为了方便出国交流,根乒乓球相关的人员都需要学习英语。
  3. 《手把手教你》系列技巧篇(五十三)-java+ selenium自动化测试-上传文件-上篇(详细教程)
  4. 原型模式(python)
  5. 第10组 Beta冲刺 (4/5)(组长)
  6. openlayers素材网站
  7. Spring循环依赖原理
  8. 若依(ruoyi)代码生成树表结构的那些坑
  9. 01-JS中字面量与变量
  10. 《剑指offer》面试题09. 用两个栈实现队列