共享内存的疑惑
Posted wangqiang3311
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了共享内存的疑惑相关的知识,希望对你有一定的参考价值。
共享内存的疑惑
代码是前辈写的,可能擅长c++,继续上一篇的文章,我把c++的代码贴出来:
static ShareDataRW() { Handle = CreateFileMappingA(new IntPtr(-1), IntPtr.Zero, 0x04, 0, 1024, "Local\\NoteFirstShare_Memory"); if (Handle == IntPtr.Zero) return; ShareDataMemoryPoint = MapViewOfFile(Handle, SECTION_ALL_ACCESS, 0, 0, 1024); ShareDataType = typeof(ShareData); if (OfficeAddinServicesPort == 0) OfficeAddinServicesPort = 4211; }
[DllImport("kernel32.dll")] public static extern IntPtr CreateFileMappingA( IntPtr hFile, IntPtr lpFileMappingAttributes, int flProtect, int dwMaximumSizeHigh, int dwMaximumSizeLow, string lpName); [DllImport("kernel32.dll")] public static extern IntPtr MapViewOfFile(IntPtr hFileMappingObject, int dwDesiredAccess, int dwFileOffsetHigh, int dwFileOffsetLow, int dwNumberOfBytesToMap);
CreateFileMappingA方法: 为指定文件创建或打开命名或未命名的文件映射对象
MapViewOfFile方法:将一个文件映射对象映射到当前应用程序的地址空间
文件映射这些概念涉及到操作系统里面的东西,不太好理解。这些可以慢慢学习的。 CreateFileMappingA函数的最后一个参数,是共享内存名称,如果我修改了这个参数值后,读写共享内存的数据就一致了。于是我去查这个参数的含义:
lpName
如果此参数与现有映射对象的名称匹配,则该函数请求具有flProtect指定的保护的对象的访问权限。
如果此参数为NULL,则创建没有名称的文件映射对象。
如果lpName与现有事件,信号量,互斥锁,等待计时器或作业对象的名称匹配,则该函数将失败,并且GetLastError 函数将返回ERROR_INVALID_HANDLE。这是因为这些对象共享相同的命名空间。
该名称可以具有“全局”或“本地”前缀,以在全局或会话命名空间中显式创建对象。名称的其余部分可以包含除反斜杠字符()之外的任何字符。从会话零以外的会话在全局命名空间中创建文件映射对象需要 SeCreateGlobalPrivilege 特权。有关更多信息,请参阅 内核对象命名空间。
通过使用终端服务会话实现快速用户切换。第一个登录用户使用会话0(零),下一个登录用户使用会话1(一),依此类推。内核对象名称必须遵循为终端服务概述的准则,以便应用程序可以支持多个用户。
这一段摘自微软官网上面,读的不甚明白。这个参数的值设置应该没什么问题,因为它没有报任何错误,可以正常读写内存。那么问题,究竟出哪呢?
以上是关于共享内存的疑惑的主要内容,如果未能解决你的问题,请参考以下文章
df 报告磁盘使用情况,但在共享内存 /dev/shm 中没有文件
如何使用模块化代码片段中的LeakCanary检测内存泄漏?
SnippetsLab for Mac 1.9 中文共享版 – 强大的代码收藏管理工具