• 创建内存映射文件



    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.关闭文件内核对象

  • 相关阅读:
    几个常见的在线评测系统,及我的点评
    信息学奥赛培训教材推荐
    致,青春
    文明小博客,管理员及网址列表
    NOIP2013,复赛及同步赛,报名及比赛,专题页面
    浅谈浏览器兼容性问题-(1)产生、看待与思考
    前端经典笔试题(腾讯前端,三栏布局)
    浅谈web语义化
    浅谈表现与数据分离
    浅谈w3c标准
  • 原文地址:https://www.cnblogs.com/xiaoxiaocaicai/p/3594820.html
Copyright © 2020-2023  润新知