Windows进程通信——内存映射

本文介绍了Windows进程间通信的一种方式——内存映射,详细阐述了其概念、使用场景和主要函数,包括CreateFileMapping、MapViewOfFile、OpenFileMapping等。内存映射允许多个进程共享数据,提高效率,常用于系统加载执行文件、访问磁盘数据及进程间通信。
摘要由CSDN通过智能技术生成

1. 概述

1.1 介绍

文件映射(Memory-Mapped Files)能使进程把文件内容当作进程地址区间一块内存那样来对待。因此,进程不必使用文件I/O操作,只需简单的指针操作就可读取和修改文件的内容。

Win32 API允许多个进程访问同一文件映射对象,各个进程在它自己的地址空间里接收内存的指针。通过使用这些指针,不同进程就可以读或修改文件的内容,实现了对文件中数据的共享。
应用程序有三种方法来使多个进程共享一个文件映射对象。
(1)继承:第一个进程建立文件映射对象,它的子进程继承该对象的句柄。
(2)命名文件映射:第一个进程在建立文件映射对象时可以给该对象指定一个名字(可与文件名不同)。第二个进程可通过这个名字打开此文件映射对象。另外,第一个进程也可以通过一些其它IPC机制(有名管道、邮件槽等)把名字传给第二个进程。
(3)句柄复制:第一个进程建立文件映射对象,然后通过其它IPC机制(有名管道、邮件槽等)把对象句柄传递给第二个进程。第二个进程复制该句柄就取得对该文件映射对象的访问权限。
文件映射是在多个进程间共享数据的非常有效方法,有较好的安全性。但文件映射只能用于本地机器的进程之间,不能用于网络中,而开发者还必须控制进程间的同步。

1.2 使用场景

内存映射文件的作用主要体现在下面3点:

(1)系统使用内存映射文件,以便加载和执行. exe和DLL文件。这可以大大节省页文件空间和应用程序启动运行所需的时间

(2)可以使用内存映射文件来访问磁盘上的数据文件。这使你可以不必对文件执行I/O操作,并且可以不必对文件内容进行缓存

(3)可以使用内存映射文件,使同一台计算机上运行的多个进程能够相互之间共享数据。Windows确实提供了其他一些方法,以便在进程之间进行数据通信,但是这些方法都是使用内存映射文件来实现的,这使得内存映射文件成为单个计算机上的多个进程互相进行通信的最有效的方法。

1.3 使用到的函数解析

对于内存文件映射,首先需要CreateFile()打开的一个文件句柄,函数原型为

HANDLE WINAPI CreateFile(
  _In_     LPCTSTR               lpFileName,
  _In_     DWORD                 dwDesiredAccess,
  _In_     DWORD                 dwShareMode,
  _In_opt_ LPSECURITY_ATTRIBUTES lpSecurityAttributes,
  _In_     DWORD                 dwCreationDisposition,
  _In_     DWORD                 dwFlagsAndAttributes,
  _In_opt_ HANDLE                hTemplateFile
);
参数dwDesiredAccess
0

不能读取或写入文件的内容。当只想获得文件的属性时,请设定0
GENERIC_READ
可以从文件中读取数据 
GENERIC_WRITE
可以将数据写入文件 
GENERIC_READ |GENERIC_WRITE
可以从文件中读取数据,也可以将数据写入文件 
参数dwShareMode
0

打开文件的任何尝试均将失败
FILE_SHARE_READ
使用GENERIC_WRITE打开文件的其他尝试将会失败
FILE_SHARE_WRITE
使用GENERIC_READ打开文件的其他尝试将会失败
FILE_SHARE_DELETE
在文件或设备上启用后续的打开操作以请求删除访问

创建文件映射对象函数CreateFileMapping(),函数原型为

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值