进程间通讯总结 (2)

本文介绍Windows环境下利用文件映射(File Mapping)进行进程间通信(IPC)的方法。文件映射允许多个进程共享同一段内存,通过简单指针操作即可访问文件内容。文章详细解释了CreateFileMapping和MapViewOfFile等API的使用,并强调了多进程间同步的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Using a File Mapping for IPC

Windows 下有很多方法实现进程间通讯, 比如用 socket,管道(Pipe), 信箱(Mailslot),等等。 但最基本最直接的还是使用内存共享。 其他方法最终还是会绕道这里

可想而知,如果物理内存只有一份,让这份内存在不同的进程中,映射到各自的虚拟地址空间上,每个进程都可以读取同一份数据,是一种最高效的数据交换方法

File mapping enables a process to treat the contents of a file as if they were a block of memory in the process's address space. The process can use simple pointer operations to examine and modify the contents of the file. When two or more processes access the same file mapping, each process receives a pointer to memory in its own address space that it can use to read or modify the contents of the file. The processes must use a synchronization object, such as a semaphore, to prevent data corruption in a multitasking environment.

KeyPoint:  File mapping is an efficient way for two or more processes on the same computer to share data, but you must provide synchronization between the processes. For more information, see File Mapping and Synchronization.

共享内存在 Windows 中是用 FileMapping实现的。我们可以用 CreateFileMapping 创建一个内存文件映射对象, CreateFileMapping 这个 API 将创建一个内核对象,用于映射文件到内存。

HANDLE WINAPICreateFileMapping(

  _In_        HANDLE                                     hFile,

  _In_opt_ LPSECURITY_ATTRIBUTES    lpAttributes,

  _In_        DWORD                                     flProtect,

  _In_        DWORD                                     dwMaximumSizeHigh,

  _In_        DWORD                                     dwMaximumSizeLow,

  _In_opt_ LPCTSTR                                  lpName

);

(https://msdn.microsoft.com/en-us/library/windows/desktop/aa366537(v=vs.85).aspx)

If hFile isINVALID_HANDLE_VALUE, the calling process must also specify a size for the file mapping object in thedwMaximumSizeHigh anddwMaximumSizeLow parameters. In this scenario,CreateFileMapping creates a file mapping object of a specified size that is backed by the system paging file instead of by a file in the file system.

有时,单纯为了共享内存,我们并不需要一个实际的文件,所以,就不需要调用 CreateFile 创建一个文件, hFile这个参数可以填写 INVALID_HANDLE_VALUE 。

Multiple processes can share a view of the same file by either using a single shared file mapping object or creating separate file mapping objects backed by the same file. A single file mapping object can be shared by multiple processes through inheriting the handle at process creation, duplicating the handle, or opening the file mapping object by name.

Creating a file mapping object does not actually map the view into a process address space. TheMapViewOfFile and MapViewOfFileEx functions map a view of a file into a process address space.

Mapping a file makes the specified portion of a file visible in the address space of the calling process.

LPVOID WINAPI MapViewOfFile(

  _In_ HANDLE hFileMappingObject,

  _In_ DWORD  dwDesiredAccess,

  _In_ DWORD  dwFileOffsetHigh,

  _In_ DWORD  dwFileOffsetLow,

  _In_ SIZE_T   dwNumberOfBytesToMap

);

Mapped views ofa file mapping object maintain internal references to the object, and a file mapping object does not close until all references to it are released.

The following illustration shows the relationship between the file on disk, a file mapping object, and a file view.

 

The file on disk can be any file that you want to map into memory, or it can be the system page file. The file mapping object can consist of all or only part of the file. It is backed by the file on disk. This means that when the system swaps out pages of the file mapping object, any changes made to the file mapping object are written to the file. When the pages of the file mapping object are swapped back in, they are restored from the file.

A file view can consist of all or only part of the file mapping object. A process manipulates the file through the file views. A process can create multiple views for a file mapping object. The file views created by each process reside in the virtual address space of that process. When the process needs data from a portion of the file other than what is in the current file view, it can unmap the current file view, then create a new file view.

When multiple processes use the same file mapping object to create views for a local file, the data is coherent. That is, the views contain identical copies of the file on disk. The file cannot reside on a remote computer if you want to share memory between multiple processes.

Note

Although CreateFileMapping works with remote files, it does not keep them coherent. For example, if two computers both map a file as writable, and both change the same page, each computer only sees its own writes to the page. When the data gets updated on the disk, it is not merged.

 

Using File Mapping

Code Example: Creating Named Shared Memory

https://msdn.microsoft.com/en-us/library/windows/desktop/aa366551(v=vs.85).aspx

资源下载链接为: https://pan.quark.cn/s/9648a1f24758 这个HTML文件是一个专门设计的网页,适合在告白或纪念日这样的特殊时刻送给女朋友,给她带来惊喜。它通过HTML技术,将普通文字转化为富有情感和创意的表达方式,让数字媒体也能传递深情。HTML(HyperText Markup Language)是构建网页的基础语言,通过标签描述网页结构和内容,让浏览器正确展示页面。在这个特效网页中,开发者可能使用了HTML5的新特性,比如音频、视频、Canvas画布或WebGL图形,来提升视觉效果和交互体验。 原本这个文件可能是基于ASP.NET技术构建的,其扩展名是“.aspx”。ASP.NET是微软开发的一个服务器端Web应用程序框架,支持多种编程语言(如C#或VB.NET)来编写动态网页。但为了在本地直接运行,不依赖服务器,开发者将其转换为纯静态的HTML格式,只需浏览器即可打开查看。 在使用这个HTML特效页时,建议使用Internet Explorer(IE)浏览器,因为一些老的或特定的网页特效可能只在IE上表现正常,尤其是那些依赖ActiveX控件或IE特有功能的页面。不过,由于IE逐渐被淘汰,现代网页可能不再对其进行优化,因此在其他现代浏览器上运行可能会出现问题。 压缩包内的文件“yangyisen0713-7561403-biaobai(html版本)_1598430618”是经过压缩的HTML文件,可能包含图片、CSS样式表和JavaScript脚本等资源。用户需要先解压,然后在浏览器中打开HTML文件,就能看到预设的告白或纪念日特效。 这个项目展示了HTML作为动态和互动内容载体的强大能力,也提醒我们,尽管技术在进步,但有时复古的方式(如使用IE浏览器)仍能唤起怀旧之情。在准备类似的个性化礼物时,掌握基本的HTML和网页制作技巧非常
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值