代码之家  ›  专栏  ›  技术社区  ›  aCuria

何时使用未命名的共享内存?

  •  3
  • aCuria  · 技术社区  · 15 年前

    您什么时候选择在windows中使用未命名的共享内存?

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

    3 回复  |  直到 15 年前
        1
  •  3
  •   Steve Townsend    15 年前

    使用未命名共享内存的一个原因是,将对文件映射的访问限制为只有那些由创建进程授予其句柄的进程。这样可以避免两个问题:

    • 任何知道名称并有足够权限创建映射文件的进程都可以占用命名对象,防止或干扰其合法使用-这允许拒绝服务攻击。
    • 意外而非恶意的名称冲突。

    当您不使用名称时,您可以确保只有您想要访问的进程才可以获取该名称。从 MSDN docs for CreateFileMapping :

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

        2
  •  3
  •   wj32    15 年前

    节对象(也称为“文件映射对象”)不仅用于在进程之间共享内存。section对象最明显的用途是映射到一个文件中进行I/O,并且在大多数情况下给对象命名并不是很有用。对于未命名的页面文件备份节(“共享内存”),您仍然可以使子进程继承句柄,以便它们可以使用这些节。

        3
  •  3
  •   Mahmoud Al-Qudsi    15 年前

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

    看看 DuplicateHandle 调用,可用于跨进程边界向未命名对象传递句柄。