使用内存映射文件在盒子上的两个进程之间交换文本

Posted

技术标签:

【中文标题】使用内存映射文件在盒子上的两个进程之间交换文本【英文标题】:text exchange between two processes on a box using Memory Mapped File 【发布时间】:2013-12-19 19:27:13 【问题描述】:

要求是能够在同一个 windows 框上的两个控制台应用程序之间实现类似“聊天”的通信。我使用命名管道实现了这一点,通过在每个应用程序中实现发送者和接收者功能。

我想尝试相同的功能,但使用内存映射文件(尽管我认为它不适合“聊天”类型的通信)。

为简单起见,假设聊天消息只是长度较短的字符串。

这是我的想法:

一个应用程序将负责创建互斥锁和内存映射文件。 称它为大师。

在每个应用程序中,我们维护两个线程,一个负责获取用户 输入和写入文件,其他负责定期 检查它是否有要读的东西。

总共有四个线程,每个线程都由一个互斥体控制,用于访问 文件。

在文件中,我认为两者都应该有自己的“部分”。说 文件大小的前一半用于主应用程序,另一半用于 第二个应用程序。

所以当用户在主应用程序中输入一行文本时,线程访问 它的一半文件并尝试在最后一个新文本之后附加新文本 行。

当应用程序读取文件中的文本部分时,如果有的话,应用程序 阅读它并删除它的部分。

这种方法正确吗?其他方法是如何使用源 ID 标记消息,以便读者知道忽略自己编写的消息。但我觉得那是不必要的字符串解析。

此外,除了每个阅读器线程定期尝试读取文件的部分以查看是否有新数据之外,您能否建议任何类型的通知机制?某种事件处理?阅读器线程只有在收到某种事件通知时才会去寻找新消息。

有什么想法吗?

【问题讨论】:

从长远来看并不理想。消息适合流协议。命名管道、套接字和消息队列已经很好地覆盖了。 @HansPassant 我知道这并不理想。但是,如果您仅限于使用单个内存映射文件,那么方法是什么? 如果我被这种不合理的技术选择所限制,在这件事上没有发言权,那么我会辞职。 @HansPassant Funny..:) 顺便说一句,这个练习是工作面试的一部分,有人提到 MMF 是一个选项,我只是好奇,如果这是唯一的选择,它如何才能做到最好做完了。即使在被录用之前我也不想辞职。 嗯,是的,假问题。我做了很多采访,我知道这种模式。这是一个标准的技巧,不是我最喜欢的技巧,提出一些完全荒谬的事情,然后看着候选人扭扭捏捏地不说他应该说的话。你不是在测试你的技术实力,而是在测试你是否有能力发表意见,并对自己有足够的信心让它坚持下去。这是一个非常重要的特性,没有人愿意雇佣“代码猴子”。你能做的最糟糕的事情就是不说出你的想法,仅仅因为你认为面试官比你知道的更多。 【参考方案1】:

我在很大程度上同意 Hans 的观点,内存映射文件在这里不一定是理想的,如果你沿着这条路走,尽管考虑使用命名事件(参见 http://msdn.microsoft.com/en-us/library/windows/desktop/ms682396(v=vs.85).aspx)而不是轮询。

您可能需要 p/invoke 才能从 c# 获取此功能。

在其余部分,为每个应用程序提供自己的文件区域,由主控管理控制部分来协调谁得到什么。

【讨论】:

以上是关于使用内存映射文件在盒子上的两个进程之间交换文本的主要内容,如果未能解决你的问题,请参考以下文章

c# 通过内存映射实现文件共享内存

windows文件映射

文件映射mmap

Windows进程间共享内存通信实例

通过使用 mmap() 在进程之间共享内存

是否可以在内存映射文件中存储python对象(特别是sklearn模型)?