进程 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的主要内容,如果未能解决你的问题,请参考以下文章

可预测的Windows中崩溃进程的退出代码

powershell 这将删除Web应用程序并离开内容数据库。这也是用于记录powershell a的PowerShell Transcripts的示例

Binder机制(一)

python进程间通信

Docker容器技术

Xcode 在运行 iOS 测试/模拟器后离开僵尸进程