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

本文共 2573 字,大约阅读时间需要 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/

你可能感兴趣的文章
OSG学习:纹理映射(二)——一维/二维/简单立方图纹理映射
查看>>
OSG学习:纹理映射(五)——计算纹理坐标
查看>>
OSG学习:纹理映射(六)——灯光
查看>>
OSPF 四种设备角色:IR、ABR、BR、ASBR
查看>>
OSPF不能发现其他区域路由时,该怎么办?
查看>>
OSPF两个版本:OSPFv3与OSPFv2到底有啥区别?
查看>>
SQL Server 存储过程
查看>>
OSPF在大型网络中的应用:高效路由与可扩展性
查看>>
OSPF技术连载17:优化OSPF网络性能利器——被动接口!
查看>>
OSPF技术连载18:OSPF网络类型:非广播、广播、点对多点、点对多点非广播、点对点
查看>>
OSPF技术连载19:深入解析OSPF特殊区域
查看>>
SQL Server 复制 订阅与发布
查看>>
OSPF技术连载20:OSPF 十大LSA类型,太详细了!
查看>>
OSPF技术连载21:OSPF虚链路,现代网络逻辑连接的利器!
查看>>
OSPF技术连载22:OSPF 路径选择 O > O IA > N1 > E1 > N2 > E2
查看>>
Padding
查看>>
paddlehub安装及对口罩检测
查看>>
paddle的两阶段基础算法基础
查看>>
SpringBoot中重写addCorsMapping解决跨域以及提示list them explicitly or consider using “allowedOriginPatterns“ in
查看>>
PageHelper 解析及实现原理
查看>>