如何在Windows上模拟shm_open?

时间:2009-07-10 18:17:53

标签: windows winapi ipc shared-memory

我的服务需要存储一些信息(至少,至少20位左右,但我可以轻松地使用更多),这样

  • 它会在服务重新启动时持续存在,即使服务崩溃或以其他方式异常终止
  • 它不会在重启后持续存在
  • 可以用很少的开销来读取和更新

如果我将此信息存储在注册表或文件中,则系统重新启动时不会自动清空。

现在,如果我使用的是现代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%的时间内,但仍在发生),此功能将用于日志记录路径。我想在此不再介绍任何文件操作。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:-1)

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