首页 > 系统相关 >Windows编程之文件映射

Windows编程之文件映射

时间:2023-11-07 16:15:02浏览次数:34  
标签:文件 HANDLE 映射 Windows 句柄 编程 对象 进程

一、文件映射概述

  • 内存映射文件:文件映射可以用于将磁盘上的文件映射到内存中。这样,文件的内容可以直接从内存中读取或写入,而不必通过磁盘I/O进行数据交换。这对于处理大型文件或需要频繁读写的文件非常有用,可以提高性能。

  • 进程间通信:文件映射也可用于进程间通信(IPC),允许不同进程之间共享数据。多个进程可以将同一个文件映射到各自的地址空间中,并在其中写入或读取数据,从而实现进程间通信和数据共享。

  • 共享内存:文件映射还可以用于在同一进程的不同线程之间共享内存数据。不同线程可以共享同一个文件映射对象,以实现线程间数据共享和同步。

下面是关于Windows中文件映射的一些关键概念和使用方法:

  • 文件映射对象:文件映射对象是一个内核对象,充当了内存中的文件映射区域的控制点。每个文件映射对象都有一个唯一的名称,可以用于在不同进程之间共享。使用CreateFileMapping函数创建文件映射对象。

  • 文件映射视图:文件映射视图是文件映射对象在进程地址空间中的一个特定部分。它允许进程直接读取或写入文件映射区域的数据。使用MapViewOfFile函数将文件映射对象映射到进程的地址空间中。

  • 访问权限:文件映射对象可以使用不同的保护级别来控制对映射视图的访问权限,包括只读、读写和写时复制等。

  • 文件句柄:文件映射通常需要与文件句柄关联,以便将文件内容映射到内存中。如果不关联文件句柄,可以创建匿名的文件映射对象。

文件映射是一种强大的技术,可以用于解决多进程协作、内存映射文件、大型数据集的高效访问等多种问题。在使用文件映射时,要小心处理共享资源的同步和互斥,以确保数据的完整性和正确性。

二、API函数介绍

1.CreateFileMapping函数

CreateFileMapping 函数用于创建一个文件映射对象,该对象可以用于在不同进程之间共享内存数据,或者在同一进程的不同地址空间中共享数据。这个函数通常用于在多个进程之间共享数据的同步和通信,以及在内存中映射大文件的部分内容,以提高文件I/O性能。

函数原型:

HANDLE CreateFileMapping(
  HANDLE                hFile,
  LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
  DWORD                 flProtect,
  DWORD                 dwMaximumSizeHigh,
  DWORD                 dwMaximumSizeLow,
  LPCTSTR               lpName
);

参数说明:

  • hFile:可选参数,可以是一个文件句柄或者一个无效句柄(INVALID_HANDLE_VALUE)。如果为文件句柄,将文件的内容映射到内存中;如果为 INVALID_HANDLE_VALUE,将创建一个匿名的文件映射对象,用于共享内存。

  • lpFileMappingAttributes:可选参数,用于设置文件映射对象的安全属性。通常设置为 NULL,表示使用默认安全属性。

  • flProtect:用于设置文件映射对象的访问保护级别,控制对映射内存的访问权限。可以使用以下常量之一:

    • PAGE_READONLY:只读
    1. PAGE_READWRITE:读写
    2. PAGE_WRITECOPY:写时复制
    3. PAGE_EXECUTE_READ:可执行和只读
    4. PAGE_EXECUTE_READWRITE:可执行和读写
  • dwMaximumSizeHighdwMaximumSizeLow:用于指定文件映射对象的最大大小。通常,可以将 dwMaximumSizeHigh 设置为 0,而 dwMaximumSizeLow 设置为映射的内存大小。

  • lpName:可选参数,用于指定文件映射对象的名称。如果在不同进程之间共享文件映射对象,可以使用相同的名称。如果为 NULL,则创建一个匿名的文件映射对象。

返回值:

如果函数调用成功,它将返回文件映射对象的句柄(HANDLE),否则返回 NULL。

2.MapViewOfFile函数

MapViewOfFile 函数用于将文件映射对象映射到当前进程的地址空间,从而允许进程访问和操作共享内存中的数据。这个函数通常与 CreateFileMapping 函数一起使用,用于创建文件映射对象并创建映射视图。 

函数原型:

HANDLE CreateFileMapping(
  HANDLE                hFile,
  LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
  DWORD                 flProtect,
  DWORD                 dwMaximumSizeHigh,
  DWORD                 dwMaximumSizeLow,
  LPCTSTR               lpName
);

参数说明:

  • hFile:可选参数,可以是一个文件句柄或者一个无效句柄(INVALID_HANDLE_VALUE)。如果为文件句柄,将文件的内容映射到内存中;如果为 INVALID_HANDLE_VALUE,将创建一个匿名的文件映射对象,用于共享内存。

  • lpFileMappingAttributes:可选参数,用于设置文件映射对象的安全属性。通常设置为 NULL,表示使用默认安全属性。

  • flProtect:用于设置文件映射对象的访问保护级别,控制对映射内存的访问权限。可以使用以下常量之一:

    1. PAGE_READONLY:只读
    2. PAGE_READWRITE:读写
    3. PAGE_WRITECOPY:写时复制
    4. PAGE_EXECUTE_READ:可执行和只读
    5. PAGE_EXECUTE_READWRITE:可执行和读写
  • dwMaximumSizeHighdwMaximumSizeLow:用于指定文件映射对象的最大大小。通常,可以将 dwMaximumSizeHigh 设置为 0,而 dwMaximumSizeLow 设置为映射的内存大小。

  • lpName:可选参数,用于指定文件映射对象的名称。如果在不同进程之间共享文件映射对象,可以使用相同的名称。如果为 NULL,则创建一个匿名的文件映射对象。

返回值:

如果函数调用成功,它将返回文件映射对象的句柄(HANDLE),否则返回 NULL。

3.OpenFileMapping函数

OpenFileMapping 函数用于打开现有的文件映射对象,以便不同进程可以共享相同的内存区域。这个函数通常与 CreateFileMapping 函数一起使用,以实现在不同进程之间共享数据的同步和通信。  

函数原型:

HANDLE OpenFileMapping(
  DWORD   dwDesiredAccess,
  BOOL    bInheritHandle,
  LPCTSTR lpName
);

参数说明:

  • dwDesiredAccess:指定打开文件映射对象时的访问权限。可以使用以下常量之一或它们的组合:

    1. FILE_MAP_READ:只读
    2. FILE_MAP_WRITE:读写
    3. FILE_MAP_EXECUTE:可执行
    4. FILE_MAP_COPY:写时复制
    5. FILE_MAP_ALL_ACCESS:所有权限(读、写、执行)
  • bInheritHandle:一个布尔值,指定返回的句柄是否可被子进程继承。通常设置为 FALSE,表示不允许子进程继承句柄。

  • lpName:要打开的文件映射对象的名称。这个名称通常由创建文件映射对象的进程指定,并用于在不同进程之间标识相同的文件映射对象。

返回值:

如果函数调用成功,它将返回文件映射对象的句柄(HANDLE),否则返回 NULL

  

 

标签:文件,HANDLE,映射,Windows,句柄,编程,对象,进程
From: https://www.cnblogs.com/TechNomad/p/17815219.html

相关文章

  • 《Unix/Linux系统编程》教材学习笔记第六章
    chapter6信号和中断“中断”是从I/O设备或协处理器发送到CPU的外部请求,它将CPU从正常执行转移到中断处理。与发送给CPU的中断请求一样,“信号”是发送给进程的请求,将进程从正常执行转移到中断处理。在讨论信号和信号处理之前,先来回顾中断的概念和机制,这有助于正确看待信号。(1)首......
  • windows10系统里学习swift环境搭建
    FU**C*DN!!公司里的windows10电脑,想抽空学学swift的语法,环境是visualstudiocode开发,使用coderunner直接运行出结果,环境是弄了半天,弄出来了。记录一下。原来以为coderunner是直接调用swift.exehelloword.swift就可以出结果,结果是想简单了,实际是需要使用swiftc编译成exe,......
  • 为何越来越大!Windows最新镜像文件已达6.24 GB:三个原因导致
    大家常用的Windows系统有很多版本,比如常见的家庭版、教育版和专业版等等。但不管是哪个版本,最近几年的Windows10和Windows11系统变的越来越臃肿是无可置疑的,最新的Windows1123H2版本的镜像文件已经达到了6.24GB。而微软之前发布的Windows95大小只有30MB,比现如今的很多网页......
  • 生物信息专业都学些什么编程语言?
    以前上课学的C/C++/Java/C#/汇编。自学的perl/python/matlab/R/等等。其实用什么语言搞科研主要看老板,我最初老板和组里其他人都用perl,我也学perl。这样方便大家交换程序。现在的老板用python,我就开始学python了。其实觉得bioinformatics的本科都会教c或者java,会了c/java其中任......
  • windows/win10/win11 关闭端口 跑的服务
    起因关闭了编辑器访问服务接口正常显示解决这里的端口为5000C:\Users\43701>netstat-aon|findstr"5000"TCP127.0.0.1:50000.0.0.0:0LISTENING11172TCP127.0.0.1:5390127.0.0.1:5000TIME_WAIT0C:\U......
  • 如何修改WINDOWS默认的3389远程端口
    3389端口是Windows2000(2003)Server远程桌面的服务端口,可以通过这个端口,用"远程桌面"等连接工具来连接到远程的服务器,如果连接上了,输入系统管理员的用户名和密码后,将变得可以像操作本机一样操作远程的电脑,因此远程服务器一般都将这个端口修改数值者者关闭。修改数值的话......
  • Windows如何查看服务器一个端口的占用情况(netstat -an)
    用以下命令就可以得到一个端口的占用情况。以下是以110端口为例:netstat-an|findstr:110  #列出所有端口占用情况netstat-ano#精确找到被占用的端口对应的PIDnetstat-ano|findstr"port"#示例netstat-ano|findstr"6644"......
  • Windows XP/2003自动登录
    单击“开始|运行”,并在输入框中键入“controluserpasswords2”,这样就可以在“用户账户”管理窗口中清除“要使用本机,用户必须输入密码”复选项的选中状态,然后按下键盘的“Ctrl+Shift+A”,将会得到一个“自动登录”的设置对话框,您可以按自己的需要设置系统在电脑启动时自动登录使用......
  • Windows xp系统中配置DCOM应用服务器
    Windowsxp系统中配置DCOM应用服务器 一协议    要确保XP系统中安装有NWLinkIPX/SPX/NetBIOSCompatibleTransportProtocol协议二DCOM配置    运行DCOMCNFG.EXE    我的电脑--属性    默认属性 --   在此计算机上启用分布式COM打勾   ......
  • (九)C#编程基础复习——while循环
    在C#中,while循环用于多次迭代一部分程序,特别是在迭代的次数不固定的情况下,建议使用while循环而不是for循环。其中,循环主体可以是一个单独的语句,也可以是多条语句组成的代码块,当表达式的为真时,循环会一直执行下去。示例代码如下:inti=1;while(i<9){Console.Write("{0}",......