【发布时间】:2010-11-09 19:34:43
【问题描述】:
我的服务需要存储一些信息(至少,至少 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% 的时间,但仍在发生),并且此功能将在日志记录路径中使用。这里就不多介绍文件操作了。
【问题讨论】:
标签: windows winapi ipc shared-memory