进程 A 离开 MemoryMapFile 可用于进程 B
Posted
技术标签:
【中文标题】进程 A 离开 MemoryMapFile 可用于进程 B【英文标题】:Process A leave MemoryMapFile available for Process B 【发布时间】:2013-12-03 12:07:16 【问题描述】:一直在谷歌上搜索,但找不到答案。之前没用过MemoryMappedFile
。刚刚阅读了它们以实现基本的 IPC。在我投入时间进行原型设计之前,谁能告诉我以下逻辑是否可行?
我打算使用非持久化内存映射文件,以便在使用后自动清理。
-
进程 A 打开
MemoryMappedFile
并向其写入数据。
进程 A 启动进程 B
进程 A 退出
进程 B 对进程 A 创建的 MemoryMappedFile
执行 OpenExisting
进程 B 从 MemoryMappedFile
读取数据并进行处理...
进程 A 和 B 都将知道文件的名称。
进程 A 创建的文件会一直保留到进程 B 处理掉它吗?
机制是什么,应该处理 A 而不是 Dispose
文件并让处理 B 来做吗?
如果这个逻辑不起作用,那么我在考虑进程 A 等待进程 B 完成,但这并不理想。
感谢您的任何启示;)
【问题讨论】:
【参考方案1】:这将起作用,除了进程 B 需要在进程 A 关闭其句柄之前打开内存映射文件的句柄。原因是最后一个句柄关闭时内存映射文件被破坏。
(我假设我们在这里谈论的是 Windows。)
编辑:我对此很感兴趣,并做了更多的阅读……
可能最正确和最可靠的方法是让进程 B 继承内存映射的句柄。一些链接:
Handle Inheritance in Windows Programmatically controlling which handles are inherited by new processes in Win32 How do I pass a lot of data to a process when it starts up?我认为最后一个链接为您提供了世界上知识最渊博的 Windows 程序员之一的典型答案。也请阅读文章下方的 cmets。
【讨论】:
谢谢伊恩,我想可能是这样。我使用持久文件并让进程 B 进行清理可能更安全。 是的,如果您不介意文件出现故障时可能会遗留下来。但实际上实现某种互锁应该不会太难,因此进程 A 不会关闭它的句柄,直到进程 B 打开它的句柄。进程 B 可以设置一个事件。 另一种选择可能是进程 A 复制一个句柄并让进程 B 继承这个复制的句柄。我还没有尝试过,但它应该可以工作。请参阅msdn.microsoft.com/en-us/library/windows/desktop/… - 是的,这是正确的做法。 酷,感谢您的帮助。我一定会读一读。今天做了一些关于匿名管道的进一步阅读,通过命令行参数将句柄传递给子进程。它不会是大量数据,子进程不需要将任何东西传回父进程,所以这似乎也符合要求。水域成功搅浑;) 如果确实是少量数据,那么在命令行中传递它是最简单的。以上是关于进程 A 离开 MemoryMapFile 可用于进程 B的主要内容,如果未能解决你的问题,请参考以下文章
powershell 这将删除Web应用程序并离开内容数据库。这也是用于记录powershell a的PowerShell Transcripts的示例