【问题标题】:Storing a value in Memory Independent of Process将值存储在独立于进程的内存中
【发布时间】:2010-05-20 11:49:28
【问题描述】:

我需要一种方法来临时存储某个值,例如进程 A。进程 A 可以在将值存储在内存中后退出。一段时间后,进程 B 访问内存的同一位置并读取该值。我需要存储在内存中,因为我不希望数据在重新启动后持久存在。但是只要系统启动,它就必须独立于进程,数据必须是可访问的。我在 windows 中尝试了 MailSlots 和 Temporary files,两者似乎都存在进程引用计数降至零的问题,实体不会保留在内存中。在 Windows 中,最好使用 Win32 API 的合适机制是什么?

  • 象头神

【问题讨论】:

    标签: windows mfc winapi process communication


    【解决方案1】:

    编写一个在启动时启动的服务,并让它创建一些共享内存。 然后这个共享内存可以被进程 A 填充,然后进程 B 可以读取它。

    如果您的系统重新启动,共享内存就会消失,而您将拥有一块全新的共享内存。 确保您的服务正确“初始化”共享内存。

    【讨论】:

    • 我能做到... Windows 本身是否提供一些共享服务/设施/API 让我存储值,而不是我编写共享服务???
    • Windows 提供了两个相关的服务来实现类似的东西——你可以在进程消失后使用注册表或文件系统来存储东西。
    • 但它们是持久的......我只需要易失性内存来存储数据
    【解决方案2】:

    当 ProcessA 退出时数据必须驻留在内存中,而不是存储在磁盘上的某个位置,有什么原因吗?当您提到临时文件时,我问这些临时文件应该可以工作,除非 ProcessA 以意外方式失败。

    根据您的需要,提供共享/快速/原子数据的好方法是通过ESENT API

    【讨论】:

      【解决方案3】:

      试试下面的。我不能说我知道这行得通,但它似乎是合理的。

      使用OpenFileMapping 在全局命名空间中创建一个共享内存文件。然后调用Duplicatehandle 并为目标进程句柄使用一些比进程A 寿命更长的进程。您可以将句柄添加到winlogon.exe 这应该会阻止共享内存在进程A 终止时被破坏。然后在进程 B 中查找共享内存文件。

      【讨论】:

      • 将句柄复制到 WinLogon 是一个冒险的想法。仅仅因为今天有一个名为 winlogon 的进程一直在运行,我认为这实际上并没有记录在案。如果它消失了,您的应用程序将被破坏。此外,将东西注入您无法控制的进程,尤其是属于 Windows 的进程,通常看起来很危险。
      • 代码注入是 Windows API 的一部分 - 查看 SetWindowsHookEx。使用 Process Explorer,我看到 KACE Networks 和 Check Point Software 都将自己注入到我机器上的 winlogon.exe 中。向另一个进程添加句柄是合法的。我的主要观点是将句柄添加到比进程 A 寿命更长的进程
      • 内存映射文件是一个很好的解决方案。这是有关创建内存映射文件以及如何从不同进程中读取的 MSDN 参考。它有代码示例。 msdn.microsoft.com/en-us/library/ms810613.aspx
      【解决方案4】:

      好吧,我设法在一个不退出的进程上创建了一个 MailSlot,其他两个进程可以作为客户端读取和写入 MailSlot 服务器......即使客户端退出,Mailslot 仍然会有数据。 .. MailSlot 服务器使我能够将数据存储在易失性内存中,只要 MailSlot 服务器进程启动.. 或操作系统启动.. 并在操作系统重新启动时消失...感谢所有想法和帮助.... :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-07
        • 1970-01-01
        • 2012-11-30
        • 1970-01-01
        • 2010-09-06
        相关资源
        最近更新 更多