2009-07-10 79 views
3

我的服务需要存储的信息数位(至少,至少有20位左右,但我可以很容易地利用更多),使得如何在Windows上模拟shm_open?

  • 它坚持在服务重新启动,即使服务崩溃或异常是其他原因而终止
  • 它不跨重启持续
  • 可以读取和非常小的开销更新

如果我在注册表或文件中存储这些信息,也不会自动清空d当系统重新启动时。现在

,如果我是一个现代的POSIX系统上,我会用shm_open,这将创建一个共享内存段横跨进程重新启动仍然存在,但不重新启动系统,并且我可以用shm_unlink把它清理干净,如果持久数据不知何故被损坏。

我发现了MSDN : Creating Named Shared Memory并开始在我的服务中重新实现它的部分;这基本上使用CreateFileMapping(INVALID_HANDLE_NAME, ..., PAGE_READWRITE, ..., "Global\\my_service")而不是shm_open("/my_service", O_RDWR, O_CREAT)

但是,我有一些担心,特别是围绕此页面文件支持的映射的生命周期。我还没有在MSDN文档中找到这些问题的答案:

  • 映射是否在重新启动时持续存在?
  • 如果没有,当所有打开的句柄关闭时,映射消失了吗?
  • 如果不是,有没有办法删除或清除映射?在使用时不需要。

如果它在重新启动时持续存在,或者在未引用时消失或无法手动重置,则此方法对我无用。

您可以验证或发现这些问题,和/或推荐不同的方法吗?


要是我们有这样保证了在重启时被清理出来的目录,我可以保存在临时文件中,有数据,但它仍然不是很理想:某些系统负载下,我们遇到文件打开/写入失败(罕见,在0.01%的时间内,但仍然发生),并且此功能将用于日志记录路径。我不想在这里介绍更多的文件操作。

回答

1

共享内存映射不会在重新启动时持续存在,并且在其所有句柄都关闭时它将消失。一个内存映射对象是一个内核对象 - 当它们的最后一个引用消失时,它们总是被删除,显式地通过CloseHandle或当包含引用的进程退出时。

尝试使用REG_OPTION_VOLATILE创建一个带有RegCreateKeyEx的注册表项 - 当相应的配置单元被卸载时,数据将不会保留。这将在HKLM的系统关闭或HKCU的用户注销时进行。

+0

感谢您确认我目前的方法存在缺陷;我刚刚得出这个结论,但还是把它做了测试。 `HKLM`中的`REG_OPTION_VOLATILE`看起来非常合适,我只需要解决一些内部的注册表包装。 – ephemient 2009-07-10 19:31:16

-1

听起来像也许你想序列化,而不是共享内存?如果这确实适合您的应用程序,则序列化的方式将取决于您的语言。如果您使用的是C++,请查看boost :: serialize。C#无疑有很多序列化选项(如java),如果这就是你正在使用的。

+0

序列化不是问题;问题在于获得序列化数据的生命期完全正确。 – ephemient 2009-07-10 19:32:01