我的服务需要存储的信息数位(至少,至少有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%的时间内,但仍然发生),并且此功能将用于日志记录路径。我不想在这里介绍更多的文件操作。
感谢您确认我目前的方法存在缺陷;我刚刚得出这个结论,但还是把它做了测试。 `HKLM`中的`REG_OPTION_VOLATILE`看起来非常合适,我只需要解决一些内部的注册表包装。 – ephemient 2009-07-10 19:31:16