什么时候会使用未命名的共享内存?

时间:2010-11-18 09:34:30

标签: c++ windows

您何时会选择在Windows中使用未命名的共享内存?

在我看来,在线程之间传递消息并不是很有用。可以改为将结构/变量的指针传递给工作线程,而是将其用作共享内存,而不是调用CreateFileMapping系统调用。

3 个答案:

答案 0 :(得分:3)

节对象(又名“文件映射对象”)不仅用于在进程之间共享内存。部分对象最明显的用法是在文件中映射以进行I / O操作,并且在大多数情况下给出对象名称并不是非常有用。对于未命名的页面文件支持的部分(“共享内存”),您仍然可以使子进程继承句柄,以便它们可以使用这些部分。

答案 1 :(得分:3)

您可以跨越流程边界将句柄传递给未命名的对象。也就是说,您实际上可以在应用程序中创建一个未命名的内存映射,并使用名称从另一个访问它而不用

查看DuplicateHandle调用,该调用可用于将句柄传递给跨进程边界的未命名对象。

答案 2 :(得分:3)

使用未命名共享内存的一个原因是将对文件映射的访问限制为仅由创建过程为其提供句柄的进程。这避免了两个问题:

  • 任何知道该名称且有足够权限创建映射文件的进程都可以蹲在您的命名对象上,防止或干扰其合法使用 - 这样就可以进行拒绝服务攻击。
  • 意外而不是恶意的名字冲突。

当您不使用名称时,您可以确定只有您想要访问的进程才能获得它。来自MSDN docs for CreateFileMapping

  

单个文件映射对象即可   通过多个进程共享   在进程中继承句柄   创建,复制句柄,或   打开文件映射对象   名。