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

C++ 何时使用未命名的共享内存?,c++,windows,C++,Windows,您何时选择在windows中使用未命名的共享内存 在我看来,线程之间的消息传递不是很有用。可以将指向结构/变量的指针传递给工作线程,并将其用作共享内存,而不是调用CreateFileMapping系统调用。节对象(也称为“文件映射对象”)不仅仅用于在进程之间共享内存。截面对象最明显的用途是在文件中映射以进行I/O,而在大多数情况下,给对象命名并不是很有用。对于支持未命名页面文件的节(“共享内存”),您仍然可以使子进程继承句柄,以便它们可以使用这些节。您可以跨进程边界将句柄传递给未命名对象。也就是

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


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

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

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


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

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

  • 任何知道名称并有足够权限创建映射文件的进程都可以占用命名对象,从而阻止或干扰其合法使用-这允许拒绝服务攻击
  • 偶然而非恶意的名称冲突
当您不使用名称时,您可以确保只有您希望访问的进程才能获得该名称。从:

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


在这种情况下,为什么不使用命名对象呢?使用未命名的有什么好处吗?然后,只要知道共享内存的名称,我们就可以获得命名共享内存的句柄。没有真正的原因,但它确实允许您动态创建句柄,而不必担心命名冲突。另外,您不需要将对象放置在
Golbal
命名空间中,还可以访问启用了安全权限的对象,以防止其他人打开它。@aCuria-我们在客户机服务器应用程序中执行此操作。服务器创建一个命名的共享内存,客户端可以查找该内存。对于每个连接,服务器都会为该连接创建一段未命名的共享内存,并将句柄传递给它。然后,客户机和服务器可以使用未命名的部分进行通信。这允许任意数量的连接到同一台服务器,并且每个连接都不会影响任何其他连接。@Graeme-虽然这正是我公布的情况,但我发现创建了一个命名管道GUID_X,其中X是客户端id,而不是传递句柄,而是将X(客户端id)传递给新连接的客户端。我想这两种方法都同样有效。您所说的“映射到文件中以进行I/O”到底是什么意思?如果它像一个文本文件,我们就不能通过LPVOID将文件的句柄传递给需要它的线程吗?我的意思是,在文件中映射不需要命名的节对象。这回答了你的问题,对吗?