我的服务需要存储一些信息(至少,至少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%的时间内,但仍在发生),此功能将用于日志记录路径。我想在此不再介绍任何文件操作。
答案 0 :(得分:1)
共享内存映射不会在重新启动后持续存在,并且当所有句柄都关闭时它将消失。内存映射对象是一个内核对象 - 当它们的最后一次引用消失时,它们总是被删除,或者通过CloseHandle显式删除,或者当包含引用的进程退出时。
尝试使用带有REG_OPTION_VOLATILE的RegCreateKeyEx创建注册表项 - 卸载相应的配置单元时不会保留数据。这将是HKLM的系统关闭或HKCU的用户注销。
答案 1 :(得分:-1)
听起来好像你想要序列化而不是共享内存?如果这确实适合您的应用程序,则序列化的方式取决于您的语言。如果您使用的是c ++,请查看boost :: serialize。毫无疑问,C#有很多序列化选项(比如java),如果这就是你正在使用的那些。