- 1、本文档共24页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
使用内存映射文件行数据共享和进程通信
使用内存映射文件进行数据共享和进程通信
之前有过比赛,看题没看清楚,后来编程需要进程通信,结果跑去学习文件内存映射文件了, 虽然比赛用不上,但是总结一下,总归没有白学。
首先问题是什么是内存映射文件,按我理解就是内存里的一个公共区,所有进程都可以访问,而且,允许每个进程或者线程访问其中的一小段,即所谓视图View。这个区由系统保管,如果没有进程或者线程使用这个内存映射文件,则这个区域就会被撤销。
然后就是这个内存映射文件如何创建的问题。
一、若要使用内存映射文件,必须执行下列操作步骤:
1) 创建或打开一个文件内核对象,该对象用于标识磁盘上你想用作内存映射文件的文件。
2) 创建一个文件映射内核对象,告诉系统该文件的大小和你打算如何访问该文件。
3) 让系统将文件映射对象的全部或一部分映射到你的进程地址空间中。
当完成对内存映射文件的使用时,必须执行下面这些步骤将它清除:
1) 告诉系统从你的进程的地址空间中撤消文件映射内核对象的映像。
2) 关闭文件映射内核对象。
3) 关闭文件内核对象。
具体如下所示:
步骤1:创建或打开文件内核对象
若要创建或打开一个文件内核对象,总是要调用C r e a t e F i l e函数:
HANDLE CreateFile(
PCSTR pszFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
PSECURITY_ATTRIBUTES psa,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile);
C r e a t e F i l e函数拥有好几个参数。这里只重点介绍前3个参数,即p s z F i l e N a m e,d w D e s i r e d A c c e s s和d w S h a r e M o d e。
你可能会猜到,第一个参数p s z F i l e N a m e用于指明要创建或打开的文件的名字(包括一个选项路径)。第二个参数d w D e s i r e d A c c e s s用于设定如何访问该文件的内容。可以设定表1所列的4个值中的一个。
表1 dwDesiredAccess的值
值 含义 0 不能读取或写入文件的内容。当只想获得文件的属性时,请设定0 G E N E R I C _ R E A D 可以从文件中读取数据 G E N E R I C _ W R I T E 可以将数据写入文件 GENERIC_READ |GENERIC_WRITE 可以从文件中读取数据,也可以将数据写入文件 当创建或打开一个文件,将它作为一个内存映射文件来使用时,请选定最有意义的一个或多个访问标志,以说明你打算如何访问文件的数据。对内存映射文件来说,必须打开用于只读访问或读写访问的文件,因此,可以分别设定G E N E R I C _ R E A D 或GENERIC_READ |G E N E R I C _ W R I T E。
第三个参数d w S h a r e M o d e告诉系统你想如何共享该文件。可以为d w S h a r e M o d e设定表2所列的4个值之一。
表2 dwShareMode 的值
值 含义 0 打开文件的任何尝试均将失败 F I L E _ S H A R E _ R E A D 使用G E N E R I C _ W R I T E打开文件的其他尝试将会失败 F I L E _ S H A R E _ W R I T E 使用G E N E R I C _ R E A D打开文件的其他尝试将会失败 FILE_SHARE_READ FILE_SHARE_WRITE| 打开文件的其他尝试将会取得成功 如果C r e a t e F i l e函数成功地创建或打开指定的文件,便返回一个文件内核对象的句柄,否则返回I N VA L I D _ H A N D L E _ VA L U E。
注意能够返回句柄的大多数Wi n d o w s函数如果运行失败,那么就会返回N U L L。但是,C r e a t e F i l e函数将返回I N VA L I D _ H A N D L E _ VA L U E,它定义为((H A N D L E)- 1)。
步骤2:创建一个文件映射内核对象
调用C r e a t e F i l e函数,就可以将文件映像的物理存储器的位置告诉操作系统。你传递的路径名用于指明支持文件映像的物理存储器在磁盘(或网络或光盘)上的确切位置。这时,必须告诉系统,文件映射对象需要多少物理存储器。
文档评论(0)