博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile
阅读量:4224 次
发布时间:2019-05-26

本文共 1392 字,大约阅读时间需要 4 分钟。

  进程间的通信方式有很多种, 上次我们说了最傻瓜的“共享外存/文件”的方法。 那么, 在本文中, 我们即将学习“共享内存”的方式实现进程间的通信, 这是IPC最快的方法。有的地方又把这种“共享内存”的方式叫做“内存映射文件”方式。

       我们首先来看看进程A对应的程序:

[cpp] 
  1. #include <iostream>  
  2. #include <windows.h>  
  3. using namespace std;  
  4.   
  5. #define BUF_SIZE 1025  
  6. char szName[] = "NameOfMappingObject";    // 共享内存的名字  
  7.   
  8. int main()  
  9. {  
  10.     // 创建共享文件句柄  
  11.     HANDLE hMapFile = CreateFileMapping(  
  12.         INVALID_HANDLE_VALUE,    // 物理文件句柄  
  13.         NULL,                    // 默认安全级别  
  14.         PAGE_READWRITE,          // 可读可写  
  15.         0,                       // 高位文件大小  
  16.         BUF_SIZE,                // 地位文件大小  
  17.         szName                   // 共享内存名称  
  18.         );  
  19.   
  20.   
  21.     char *pBuf = (char *)MapViewOfFile(  
  22.         hMapFile,            // 共享内存的句柄  
  23.         FILE_MAP_ALL_ACCESS, // 可读写许可  
  24.         0,  
  25.         0,  
  26.         BUF_SIZE  
  27.         );  
  28.   
  29.   
  30.     while(1)  
  31.     {  
  32.         cout << "input..." << endl;  
  33.         char szInfo[BUF_SIZE] = {0};  
  34.         gets(szInfo); // 其实gets并不安全  
  35.         strncpy(pBuf, szInfo, BUF_SIZE - 1);  
  36.         pBuf[BUF_SIZE - 1] = '\0';  
  37.     }  
  38.   
  39.     UnmapViewOfFile(pBuf);  
  40.     CloseHandle(hMapFile);  
  41.     return 0;  
  42. }  

      然后, 我们再来看看进程B对应的程序:

[cpp] 
  1. #include <iostream>  
  2. #include <windows.h>  
  3. using namespace std;  
  4.   
  5. #define BUF_SIZE 1025  
  6. char szName[] = "NameOfMappingObject";    // 共享内存的名字  
  7.   
  8. int main()  
  9. {  
  10.     // 创建共享文件句柄  
  11.     HANDLE hMapFile = CreateFileMapping(  
  12.         INVALID_HANDLE_VALUE,    // 物理文件句柄  
  13.         NULL,                    // 默认安全级别  
  14.         PAGE_READWRITE,          // 可读可写  
  15.         0,                       // 高位文件大小  
  16.         BUF_SIZE,                // 地位文件大小  
  17.         szName                   // 共享内存名称  
  18.         );  
  19.   
  20.   
  21.     char *pBuf = (char *)MapViewOfFile(  
  22.         hMapFile,            // 共享内存的句柄  
  23.         FILE_MAP_ALL_ACCESS, // 可读写许可  
  24.         0,  
  25.         0,  
  26.         BUF_SIZE  
  27.         );  
  28.   
  29.     while(1)  
  30.     {  
  31.         cout << "press any button to receive data..." << endl;  
  32.         getchar();  
  33.         cout << pBuf << endl;  
  34.     }  
  35.   
  36.     UnmapViewOfFile(pBuf);  
  37.     CloseHandle(hMapFile);  
  38.     return 0;  

转载地址:http://zkkqi.baihongyu.com/

你可能感兴趣的文章
Web前端学习笔记——JavaScript 之继承、函数进阶
查看>>
Web前端学习笔记——JavaScript之面向对象游戏案例:贪吃蛇
查看>>
不做单元测试?小心得不偿失!嵌入式系统单元测试工具,自动生成测试用例
查看>>
一种实用的联网汽车无线攻击方法及车载安全协议
查看>>
光靠欺骗检测是不够的:对抗多目标跟踪的攻击
查看>>
基于微区块链的V2X地理动态入侵检测
查看>>
面向V2C场景的ADAS数字孪生模型构建方法
查看>>
Comma2k19数据集使用
查看>>
面向自动驾驶车辆验证的抽象仿真场景生成
查看>>
一种应用于GPS反欺骗的基于MLE的RAIM改进方法
查看>>
自动驾驶汽车GPS系统数字孪生建模(一)
查看>>
自动驾驶汽车GPS系统数字孪生建模(二)
查看>>
CUDA 学习(五)、线程块
查看>>
CUDA 学习(八)、线程块调度
查看>>
CUDA 学习(九)、CUDA 内存
查看>>
CUDA 学习(十一)、共享内存
查看>>
游戏感:虚拟感觉的游戏设计师指南——第十四章 生化尖兵
查看>>
游戏感:虚拟感觉的游戏设计师指南——第十五章 超级马里奥64
查看>>
游戏感:虚拟感觉的游戏设计师指南——第十七章 游戏感的原理
查看>>
游戏感:虚拟感觉的游戏设计师指南——第十八章 我想做的游戏
查看>>