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

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

       进程间的通信方式有很多种, 上次我们说了最傻瓜的“共享外存/文件”的方法。

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

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

 

#include 
#include
using namespace std;#define BUF_SIZE 1025char szName[] = "NameOfMappingObject"; // 共享内存的名字int main(){ // 创建共享文件句柄 HANDLE hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE, // 物理文件句柄 NULL, // 默认安全级别 PAGE_READWRITE, // 可读可写 0, // 高位文件大小 BUF_SIZE, // 地位文件大小 szName // 共享内存名称 ); char *pBuf = (char *)MapViewOfFile( hMapFile, // 共享内存的句柄 FILE_MAP_ALL_ACCESS, // 可读写许可 0, 0, BUF_SIZE ); while(1) { cout << "input..." << endl; char szInfo[BUF_SIZE] = {0}; gets(szInfo); // 其实gets并不安全 strncpy(pBuf, szInfo, BUF_SIZE - 1); pBuf[BUF_SIZE - 1] = '\0'; } UnmapViewOfFile(pBuf); CloseHandle(hMapFile); return 0;}

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

 

 

#include 
#include
using namespace std;#define BUF_SIZE 1025char szName[] = "NameOfMappingObject"; // 共享内存的名字int main(){ // 创建共享文件句柄 HANDLE hMapFile = CreateFileMapping( INVALID_HANDLE_VALUE, // 物理文件句柄 NULL, // 默认安全级别 PAGE_READWRITE, // 可读可写 0, // 高位文件大小 BUF_SIZE, // 地位文件大小 szName // 共享内存名称 ); char *pBuf = (char *)MapViewOfFile( hMapFile, // 共享内存的句柄 FILE_MAP_ALL_ACCESS, // 可读写许可 0, 0, BUF_SIZE ); while(1) { cout << "press any button to receive data..." << endl; getchar(); cout << pBuf << endl; } UnmapViewOfFile(pBuf); CloseHandle(hMapFile); return 0;}

     先后运行上面两个程序, 得到的结果为(下图中的单词that应该是than, 我写错了微笑):

 

你可能感兴趣的文章
《坐天下很累》 张宏杰 (值得多看)
查看>>
《清官海瑞》 郦波
查看>>
《救时宰相于谦》 郦波
查看>>
利用matlab把向量b插入到a中
查看>>
matlab多项式拟合
查看>>
如何用命令行法和系统调用法运行.exe ?
查看>>
在“开始”“运行”中输入cmd, calc, winmine是干什么?
查看>>
用一个日历程序来诠释top-down design和bottom-up implementation
查看>>
由电脑缺扫雷游戏想到的: 如何把自己的.exe放到系统中?
查看>>
Mac - SecureCRT安装(试了一下,靠谱)
查看>>
mac securecrt无法记住密码的解决方法 (试了一下,靠谱)
查看>>
Mac 上sshd 服务启用------便于用在mac上用securecrt连接mac自己 (试了一下,靠谱)
查看>>
go gin server初体验
查看>>
golang安装gRpc------预料之中的timeout(也遇到过)
查看>>
小议并实战go包------顺便说说go中的GOROOT,GOPATH和src,pkg,bin
查看>>
~/.bashrc和./bash_profile的一点小区别------说说~/.bashrc的不生效问题
查看>>
protoc和protoc-gen-go产生的代码的区别
查看>>
用go来玩最简单的web服务器------顺便说说Content-Type字段
查看>>
用go来搭建一个简单的图片上传网站
查看>>
从go服务端“设置cookie“来看cookie的本质
查看>>