创建内存映射文件


a.创建或打开一个文件内核对象,该对象标识了想要用作内存映射文件的磁盘文件
HANDLE CreateFile(PCSTR pszFileName,
DWORD dwDesiredAccess,//如何访问文件
DWORD dwShareMode,//如何共享文件
PSECURITY_ATTRUBUTES psa,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplationFile)
b.创建文件映射内核对象,告诉系统文件的大小及我们打算如何访问文件
HANDLE CreateFileMapping(HDNDLE hFile,
PSECURITY_ATTRIBUTES psa,
DWORD fdwProtect,//给物理存储器的页面指定何种属性
DWORD dwMaximumSizeHigh,//系统内存映射文件的最大大小
DWORD dwMaximumSizeLow,
PCTSTR pszName)
如果想要用当前的文件大小创建一个文件映射对象,只要传0就行了,
如果想要给文件追加数据,就要给文件最大文件大小参数留有余地
如果当前磁盘上的文件大小为0,就不能传0给指定大小的参数
如果给函数传入PAGE_READWRITE,系统会检查并确保磁盘上对应文件的大小不小于dwMaximumSizeHigh和dwMaximumSizeLow
参数指定的大小

c.把文件映射对象的部分或全部数据映射到进程的地址空间中
PVOID MapViewOfFile(HANDLE hFileMappingObject,
DWORD dwDesiredAccess,//如何访问数据
DWORD dwFileOffsetHigh,//从数据文件中哪个字节开始映射
DWORD dwFileOffsetLow,
SIZE_T dwNumberOfBytesToMap//映射数据文件的多少字节)
如果指定了FILE_MAP_COPY标志,系统会从页交换文件中调拨物理存储器,大小由dwNumberOfBytesToMap参数决定
一旦某个线程写入文件映射视图中的任何内存地址,系统就会从页文交换文件中已调拨的页面中选择一个页面,把原始数
据复制到页交换文件中的页面,然后把复制的页面复制到进程的地址空间中,各线程将访问数据的副本
系统对原始文件进行复制时,系统会把页面的保护属性冲PAGE_WRITECOPY改为PAGE_READWRITE

d.从进程地址空间中取消对文件内核对象的映射
BOOL UnmapViewOfFile(PVOID pvBaseAddress)
pvBaseAddress指定区域的基地址,必须和MapViewOfFile的返回值相同
系统会对文件数据的页面进行缓存处理,这样在处理文件映射视图的时候就不需要随时更新磁盘上的文件
如果需要确保所做的修改已经被写入到磁盘中,可以调用FlushViewOfFile,强制系统把部分或全部修改的数据写入到磁盘

BOOL FlushViewOfFile(PVOID pvAddress,//视图的第一个字节地址
SIZE_T dwNumberOfBytesToFlush//要刷新的字节数)
为了确保FlushViewOfFile服务器也会把数据写入到磁盘上,创建文件映射对象并将它映射到视图中的时候,应该传
FILE_FLAG_WRITE_THROUGH标识给CreateFile函数

e.关闭文件映射内核对象

f.关闭文件内核对象

原文地址:https://www.cnblogs.com/xiaoxiaocaicai/p/3594820.html