进程间通信之共享内存(Share Memory)
2016-05-27 11:38
411 查看
为了实现多个进程之间的通信,我们可以用系统页面文件来作为共享内存文件。
1.首先我们创建第一个进程,用系统函数CreateFileMapping创建共享内存文件,用函数MapViewOfFile映射共享内存文件到进程,具体操作见代码:
#include <Windows.h> #include <conio.h> #include <tchar.h> #include <iostream> using namespace std; const size_t BUF_SIZE = 256; TCHAR szName[]=TEXT("Local\\MyFileMappingObject"); TCHAR szMsg[]=TEXT("Message from first process."); int main(void) { HANDLE hAndle = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, BUF_SIZE, szName); if (NULL == hAndle) { cout<<"Could not create file mapping object:"<<GetLastError()<<endl; return EXIT_FAILURE; } LPCTSTR pBuf = (LPCTSTR)MapViewOfFile(hAndle, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE); if (NULL == pBuf) { cout<<"Could not map view of file :"<<GetLastError()<<endl; CloseHandle(hAndle); return EXIT_FAILURE; } CopyMemory((PVOID)pBuf,szMsg,(_tcslen(szMsg)*sizeof(TCHAR))); _getch(); UnmapViewOfFile(pBuf); CloseHandle(hAndle); return EXIT_SUCCESS; }
2.这下我们可以创建第二个进程对共享内存文件访问,用系统函数OpenFileMapping打开内存映射文件对象,具体操作见如下代码:
#include <Windows.h> #include <iostream> using namespace std; const size_t BUF_SIZE = 256; TCHAR szName[]=TEXT("Local\\MyFileMappingObject"); int main(void) { HANDLE hAndle = OpenFileMapping(FILE_MAP_ALL_ACCESS,false,szName); if (NULL == hAndle) { cout<<"Could not open file mapping object :"<<::GetLastError()<<endl; return EXIT_FAILURE; } LPCTSTR pBuf = (LPCTSTR)MapViewOfFile(hAndle, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE); if (NULL == pBuf) { cout<<"Could not map view of file :"<<GetLastError()<<endl; CloseHandle(hAndle); return EXIT_FAILURE; } MessageBox(NULL,pBuf,TEXT("Process2"),MB_OK); UnmapViewOfFile(hAndle); CloseHandle(hAndle); return EXIT_SUCCESS; }
3.运行时运行第一个进程后运行第二个进程,第二个进程能够获取到第一个进程的信息,这样我们进程间通讯已经完整完成。
相关文章推荐
- Linux进程间通信——使用共享内存
- IPC-共享内存
- 进程间通信(IPC)---共享内存
- 2016-5-27:实验室第二天
- iOS 自定义照相机
- HTTP协议及报文分析
- iOS知识---针对多个显示内容空间不定内容长度的显示问题Content Hugging 和 Content Compression Resistance
- 轻量web服务器开发日记10-server结构体的实现
- Ehcache详细解读
- 快捷开发 Android通用流行框架大全
- 技术题材收集
- hdfs 常用命令
- C#中的WebBrowser控件的使用
- 实践2.2 内核模块编译
- centos7 网卡激活
- MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作
- Redis集群搭建
- java RSA加密解密实现
- vlc使用ffmepg get_buffer2流程
- 搭建阿里云环境 - 阿里云 centOS 如何安装 node.js