Windows环境下利用“共享内存”实现进程间通信的C/C++代码---利用CreateFileMapping和MapViewOfFile
2015-06-27 23:16
891 查看
进程间的通信方式有很多种, 上次我们说了最傻瓜的“共享外存/文件”的方法。 那么, 在本文中, 我们即将学习“共享内存”的方式实现进程间的通信, 这是IPC最快的方法。有的地方又把这种“共享内存”的方式叫做“内存映射文件”方式。
我们首先来看看进程A对应的程序:
[cpp] view
plaincopy
#include <iostream>
#include <windows.h>
using namespace std;
#define BUF_SIZE 1025
char 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对应的程序:
[cpp] view
plaincopy
#include <iostream>
#include <windows.h>
using namespace std;
#define BUF_SIZE 1025
char 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;
我们首先来看看进程A对应的程序:
[cpp] view
plaincopy
#include <iostream>
#include <windows.h>
using namespace std;
#define BUF_SIZE 1025
char 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对应的程序:
[cpp] view
plaincopy
#include <iostream>
#include <windows.h>
using namespace std;
#define BUF_SIZE 1025
char 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;
相关文章推荐
- android:ellipsize的使用
- Unity 自定义字体 Custom Font 原理 二
- ios 取消键盘响应
- iOS Dyci Xcode 动态注入插件
- android应用程序优化之布局优化
- 【Unity】Mesh网格编程(四)麦比乌斯环
- Android之TextView的Span样式源码剖析
- 微信裂变红包
- Android学习之-RecyclerView带刺的玫瑰
- android style中出现自定义属性时的写法
- xUtils 源码解析
- Android的资源类型和存储方式简介-android学习之旅(五十二)
- Android的资源类型和存储方式简介-android学习之旅(五十二)
- Android的资源类型和存储方式简介-android学习之旅(五十二)
- Intent的Data和Type和Flag属性-amdroid学习之旅(五十一)
- swift学习笔记二
- 调试iOS App的WebView
- Unity 自定义字体 新功能 一
- ios动画
- Android之Adapter用法总结