博客
关于我
进程间通信(2) 内存映射FileMap
阅读量:81 次
发布时间:2019-02-25

本文共 2634 字,大约阅读时间需要 8 分钟。

文件映射对象

文件映射对象是内核对象,它从系统的分页文件中获取一段内存。所有内核对象共享同一个名字空间,因此名称必须唯一。除了文件映射对象外,其他内核对象还包括事件、信号和互斥对象。

创建文件映射对象

要创建一个文件映射对象,需要指定其大小和名称。Windows API CreateFileMapping用于实现这一点。该函数接收以下参数:

  • INVALID_HANDLE_VALUE:使用内核分页文件(共享内存)。
  • NULL:默认安全属性。
  • PAGE_READWRITE:允许读写访问。
  • 0MAP_SIZE:用于指定文件映射的最大大小。
  • FULL_MAP_NAME:文件映射对象的名称。

如果创建失败,函数返回 NULL,并显示错误信息。

文件映射对象的读写操作

要对文件映射对象进行读写操作,使用 MapViewOfFile API。该函数接收以下参数:

  • 文件映射对象的句柄。
  • FILE_MAP_ALL_ACCESS:允许读写访问。
  • 文件起始偏移。
  • 视图大小。

成功映射后,可以通过 memcpy_s 等函数进行读写操作。

示例

以下是一个完整的示例代码:

// Prepare a message to be written to the view.
PWSTR pszMessage = (PWSTR)MESSAGE;
DWORD cbMessage = (wcslen(pszMessage) + 1) * sizeof(*pszMessage);
HANDLE hMapFile = NULL;
PVOID pView = NULL;
// 创建文件映射对象
hMapFile = CreateFileMapping(
INVALID_HANDLE_VALUE, // 使用内核分页文件
NULL, // 默认安全属性
PAGE_READWRITE, // 允许读写访问
0, // 高位DWORD文件映射最大大小
MAP_SIZE, // 低位DWORD文件映射最大大小
FULL_MAP_NAME // 文件映射对象名称
);
if (hMapFile == NULL) {
wprintf(L"CreateFileMapping failed w/err 0x%08lx\n", GetLastError());
goto Cleanup;
}
wprintf(L"The file mapping (%s) is created\n", FULL_MAP_NAME);
// 将文件映射映射到当前进程的地址空间
pView = MapViewOfFile(
hMapFile, // 文件映射对象句柄
FILE_MAP_ALL_ACCESS, // 允许读写访问
0, // 高位DWORD文件偏移
VIEW_OFFSET, // 低位DWORD文件偏移
VIEW_SIZE // 要映射到视图的字节数
);
if (pView == NULL) {
wprintf(L"MapViewOfFile failed w/err 0x%08lx\n", GetLastError());
goto Cleanup;
}
wprintf(L"The file view is mapped\n");
// 将消息写入视图
memcpy_s(pView, VIEW_SIZE, pszMessage, cbMessage);
wprintf(L"This message is written to the view:\n\"%s\"\n", pszMessage);

客户端示例

以下是客户端代码示例:

HANDLE hMapFile = NULL;
PVOID pView = NULL;
// 打开已命名的文件映射对象
hMapFile = OpenFileMapping(
FILE_MAP_READ, // 只允许读取访问
FALSE, // 不继承名称
FULL_MAP_NAME // 文件映射对象名称
);
if (hMapFile == NULL) {
wprintf(L"OpenFileMapping failed w/err 0x%08lx\n", GetLastError());
goto Cleanup;
}
wprintf(L"The file mapping (%s) is opened\n", FULL_MAP_NAME);
// 将文件映射映射到当前进程的地址空间
pView = MapViewOfFile(
hMapFile, // 文件映射对象句柄
FILE_MAP_READ, // 只允许读取访问
0, // 高位DWORD文件偏移
VIEW_OFFSET, // 低位DWORD文件偏移
VIEW_SIZE // 要映射到视图的字节数
);
if (pView == NULL) {
wprintf(L"MapViewOfFile failed w/err 0x%08lx\n", GetLastError());
goto Cleanup;
}
wprintf(L"The file view is mapped\n");
// 从视图读取内容
wprintf(L"Read from the file mapping:\n\"%s\"\n", (PWSTR)pView);

结果

通过上述代码示例,可以实现文件映射对象的创建与使用。服务器代码创建并写入内容,客户端代码读取并显示内容。

转载地址:http://dlm.baihongyu.com/

你可能感兴趣的文章
NodeJs学习笔记001--npm换源
查看>>
NodeJs学习笔记002--npm常用命令详解
查看>>
nodejs学习笔记一——nodejs安装
查看>>
vue3+Element-plus icon图标无法显示的问题(已解决)
查看>>
NodeJS实现跨域的方法( 4种 )
查看>>
nodejs封装http请求
查看>>
nodejs常用组件
查看>>
nodejs开发公众号报错 40164,白名单配置找不到,竟然是这个原因
查看>>
Nodejs异步回调的处理方法总结
查看>>
NodeJS报错 Fatal error: ENOSPC: System limit for number of file watchers reached, watch ‘...path...‘
查看>>
nodejs支持ssi实现include shtml页面
查看>>
Nodejs教程09:实现一个带接口请求的简单服务器
查看>>
nodejs服务端实现post请求
查看>>
nodejs框架,原理,组件,核心,跟npm和vue的关系
查看>>
Nodejs概览: 思维导图、核心技术、应用场景
查看>>
nodejs模块——fs模块
查看>>
Nodejs模块、自定义模块、CommonJs的概念和使用
查看>>
nodejs生成多层目录和生成文件的通用方法
查看>>
nodejs端口被占用原因及解决方案
查看>>
Nodejs简介以及Windows上安装Nodejs
查看>>