文档章节

使用文件映射实现进程通信

来来叔叔
 来来叔叔
发布于 2017/08/04 23:56
字数 495
阅读 14
收藏 0
 

使用文件映射实现进程通信是通过让两个或更多的进程映射同一文件映射对象的视图来实现的,也就是说它们共享着相同的物理存储页面。结果,当一个进程对在一个共享文件映射对象的视图中的数据进行写操作时,其它进程立刻在它们的视图中看到了改动。注意,对于多个进程共享一个文件映射对象,所有进程必须对该文件映射对象使用完全相同的名字。

使用内存映射文件时,调用CreateFileMapping()创建文件。一旦已创建了一个文件映射对象后,就需要告诉系统你想把文件映射到一个地址空间。这可以通过调用MapViewOfFile来实现。

CreateFileMapping()的函数声明:
HANDLE CreateFileMapping(
HANDLE hFile,                             //文件的句柄
LPSECURITY_ATTRIBUTES lpAttributes,   //与安全有关的设置
DWORD flProtect,                          //用来决定与view有关的属性
DWORD dwMaximumSizeHigh,               //设置映射文件的尺寸
DWORD dwMaximumSizeLow,
LPCTSTR lpName                           //文件映射对象的名称
);
MapViewOfFile()函数的声明:
LPVOID MapViewOfFile(
HANDLE hFileMappingObject,         //文件映射的句柄
DWORD dwDesiredAccess,            //此view的属性
DWORD dwFileOffsetHigh,            //view文件的起点
DWORD dwFileOffsetLow,      
SIZE_T dwNumberOfBytesToMap      //映射区的大小
);
发送端(写数据):

void CSendDlg::OnBnClickedButton1()
{
// TODO: 在此添加控件通知处理程序代码
HANDLE m_hMap;  
WCHAR* m_lpData;

m_hMap=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,0x200,_T("MYSHARE"));  

//将文件的视图映射到一个进程的地址空间上,返回LPVOID类型的内存指针
m_lpData=(WCHAR*)MapViewOfFile(m_hMap,FILE_MAP_ALL_ACCESS,0,0,0);  

//给这段映像内存写数据
   wsprintf(m_lpData,_T(“Hello."));

}

接收端(读数据):
void CReceiveDlg::OnBnClickedButton1()
{
HANDLE m_hMap=NULL;
WCHAR* m_lpData;  

//m_hMap=CreateFileMapping((HANDLE)0xFFFFFFFF,NULL,PAGE_READWRITE,0,0x200,"MYSHARE");  
m_hMap = OpenFileMapping(FILE_MAP_WRITE,FALSE,"MYSHARE");
if(m_hMap==NULL)
   return;


//将文件的视图映射到一个进程的地址空间上,返回LPVOID类型的内存指针
m_lpData=(WCHAR*)MapViewOfFile(m_hMap,FILE_MAP_ALL_ACCESS,0,0,0);  
if(m_lpData==NULL)
   return;
//。。。   

//释放映像内存
UnmapViewOfFile(m_lpData);
CloseHandle(m_hMap);
}


© 著作权归作者所有

来来叔叔
粉丝 0
博文 100
码字总数 55732
作品 0
广州
高级程序员
私信 提问
windows下进程间通信的手段有哪些?

作者:李志刚 纪玉波 程小茁 崔朝辉 摘 要 随着人们对应用程序的要求越来越高,单进程应用在许多场合已不能满足人们的要求。编写多进程/多线程程序成为现代程序设计的一个重要特点,在多进程...

长平狐
2012/09/20
156
0
进程间通信方式

1、进程间通信方式 (1)windows进程间通信方式 1、文件映射; 2、共享内存(是文件映射的一种特殊情况); 3、邮件槽(mailslot)(点对点消息队列); 4、匿名管道; 5、命名管道; 6、剪贴...

野渡书生
2016/05/05
54
0
windows下进程间通信的方式

1 进程与进程通信   进程是装入内存并准备执行的程序,每个进程都有私有的虚拟地址空间,由代码、数据以及它可利用的系统资源(如文件、管道等)组成。多进程/多线程是Windows操作系统的一个...

技术小阿哥
2017/11/27
0
0
Windows进程间通信

参考文献1:http://blog.csdn.net/leftla/article/details/11564539 参考文献2:http://www.cppblog.com/TechLab/archive/2005/12/30/2272.aspx /////////////////////////////////////////......

曾劲松
2016/08/22
100
0
python 基于mmap模块的jsonmmap实现本地多进程内存共享

python 基于mmap模块的jsonmmap实现本地多进程内存共享 1.概述 + 共享内存可以说是最有用的进程间通信方式.两个不用的进程共享内存的意思是:同一块物理内存被映射到两个进程的各自的进程地址...

ding465398889
2013/10/16
5.9K
8

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7.6中安装使用fcitx框架

内容目录 一、为什么要使用fcitx?二、安装fcitx框架三、安装搜狗输入法 一、为什么要使用fcitx? Gnome3桌面自带的输入法框架为ibus,而在使用ibus时会时不时出现卡顿无法输入的现象。 搜狗和...

技术训练营
昨天
5
0
《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
昨天
8
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
昨天
10
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
昨天
6
0
PHP+Ajax微信手机端九宫格抽奖实例

PHP+Ajax结合lottery.js制作的一款微信手机端九宫格抽奖实例,抽奖完成后有收货地址添加表单出现。支持可以设置中奖概率等。 奖品列表 <div class="lottery_list clearfix" id="lottery"> ......

ymkjs1990
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部