【问题标题】:Use named pipes (or something else) as in-memory files使用命名管道(或其他东西)作为内存文件
【发布时间】:2010-12-03 12:16:57
【问题描述】:

我已经浏览了一段时间的 WinAPI 文档,但我似乎无法找到答案。我想要实现的是给程序一个文件名,它可以打开并使用它,就像磁盘上的普通文件一样。但我希望这个对象在内存中。

我尝试使用命名管道,它们可以在某些情况下工作,但并非总是如此。我创建了一个命名管道并将其作为常规文件传递给子进程。当进程存在时,我从管道中收集数据。

program.exe \\.\pipe\input_pipe

虽然面临一些限制。其中之一是它们不可搜索。第二个限制是它们应该以完全正确的权限打开。我发现的第三个问题是,在另一端打开之前,您不能将任何数据预先放入双工管道。有没有办法克服命名管道的这些限制?

或者也许有其他类型的对象可以用CreateFile 打开,然后用ReadFileWriteFile 访问。到目前为止,我看到的唯一解决方案是创建文件系统驱动程序并自己实现所有功能。

为了清楚起见,我想指出我无法更改我正在运行的子程序。主要思想是给该程序一些它认为是普通文件的东西。

更新:我不是在寻找涉及安装任何外部软件的解决方案。

【问题讨论】:

  • 为什么要它在内存中?
  • @Len:两个原因。出于性能原因,我不希望任何人看到此文件。
  • 性能原因是假的。在 Windows 上,当您分配内存时,您会分配磁盘。分页文件。您永远不会写入磁盘,而是写入 RAM。如果它的读取速度足够快,它也会从 RAM 中读取。文件系统缓存。大多数 32 位机器上大约 1 GB,64 位机器上更多。

标签: windows winapi file pipe


【解决方案1】:

Memory-mapped files 可以让你做你想做的事。

编辑:

重读问题 - 由于接收程序已经使用CreateFile/ReadFile/WriteFile 并且无法修改,因此这将不起作用。除了第三方或自写的 RAMDisk 解决方案之外,我想不出一种方法来做 OP 想要的。

【讨论】:

  • 我试过这个一二。要么我做错了什么,要么它无法做我需要做的事情。有没有办法创建一个命名文件映射对象,然后在上面使用CreateFilefopen
  • 如果无法打开,应该可以将映射句柄复制到远程进程中。
  • @Chris:我唯一可以传递给子进程的就是一个文件名,它将被提供给fopenCreateFile
  • 内存映射文件不是更多地为程序提供了一个不同的接口来读取/写入数据吗?如果您想理想地使用 ReadFile/WriteFile,那么内存映射文件会带您远离目标,而不是朝着目标前进。 (同时,您可以通过通常使用带有一些不同标志的 CreateFile 来获得相同类型的“将其保存在内存中并且不会撞到磁盘”缓存。)
  • @Leo - 这个想法是接收程序使用文件名将文件映射到内存中。我同意(在重读 q 时),因为接收程序已经使用 CreateFile/ReadFile/WriteFile 并且无法修改,这将不起作用。除了第三方或自写的 RAMDisk 解决方案之外,我想不出一种方法来做 OP 想要的。
【解决方案2】:

正如您所建议的,最简单的解决方案可能是使用a Ramdisk 将虚拟驱动器映射到内存。那么显然,您写入或从该虚拟驱动器读取的任何文件都将完全包含在 RAM 中(假设它没有被分页到磁盘)。

我自己已经这样做了几次,以加快完全受磁盘限制的进程。

【讨论】:

  • 我想过,但我不希望我的程序依赖于任何其他软件并让用户安装它。最坏的情况是我可以使用 Dokan 库自己完成,但这仍然需要安装驱动程序。
  • @detunized:您应该更新您的问题以反映这一点。我会将答案留给在类似情况下遇到您的问题的其他人。
【解决方案3】:

调用 CreateFile 但使用 FILE_ATTRIBUTE_TEMPORARY 并且可能还有 FILE_FLAG_DELETE_ON_CLOSE。

除非系统的物理内存不足,否则文件将永远不会进入磁盘。

【讨论】:

  • 谢谢,我知道,但这不是我需要的。
  • 有什么不合适的?您似乎想要一个仅存在于内存中的类文件对象,并且最好可以通过 CreateFile/ReadFile/WriteFile 访问。您可以使用实际文件完成所有这些操作。 :) 这里有什么额外要求?
  • 它实际上不在内存中。当子进程崩溃时,文件会转到磁盘。我试过了。
  • 即使关闭时删除?我知道那个标志和多个句柄有一些奇怪的语义,所以你可能是对的......我不确定你会找到一个满足你所有限制的解决方案,但祝你好运!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
  • 1970-01-01
  • 1970-01-01
  • 2018-10-28
  • 2011-05-23
  • 2012-08-22
  • 1970-01-01
相关资源
最近更新 更多