我的服务需要存储一些信息(至less20位左右,但我可以轻松使用更多)
如果我将这些信息存储在registry或文件中,系统重新引导时不会自动清空。
现在,如果我在一个现代的POSIX系统上,我会使用shm_open
,这将创build一个共享内存段,在整个进程重新启动但不是系统重新启动,我可以使用shm_unlink
清理它,如果持久数据不知何故被损坏。
我发现MSDN:创build命名的共享内存,并开始在我的服务中重新实现它的部分; 这基本上使用CreateFileMapping(INVALID_HANDLE_NAME, ..., PAGE_READWRITE, ..., "Global\\my_service")
而不是shm_open("/my_service", O_RDWR, O_CREAT)
。
不过,我有一些担心,特别是围绕这个页面文件支持的映射的生命周期。 我没有在MSDN文档中find这些问题的答案:
如果它在重启之后仍然存在,或者在未引用时消失,或者无法手动重置,则此方法对我来说是无用的。
你可以validation或发现这些问题,和/或推荐一个不同的方法?
如果有一个目录保证在重新启动时被清除,我可以将数据保存在一个临时文件中,但仍然不是很理想:在某些系统负载下,我们遇到文件打开/写入失败(罕见,在0.01%的时间内,但仍然发生),并且这个function被用于日志loggingpath中。 我不想在这里介绍更多的文件操作。
共享内存映射不会在重新启动时持续存在,并且在其所有句柄关闭时都将消失。 一个内存映射对象是一个内核对象 – 当它们的最后一个引用消失时,它们总是被删除,无论是通过CloseHandle显式还是包含引用的进程退出。
尝试使用RegCreateKeyEx与REG_OPTION_VOLATILE创建注册表项 – 卸载对应的配置单元时,数据将不会保留。 这将在HKLM的系统关闭或HKCU的用户注销。
听起来像也许你想序列化,而不是共享内存? 如果这确实适合您的应用程序,则序列化的方式将取决于您的语言。 如果你正在使用c ++,请查看boost :: serialize。 C#无疑有很多序列化选项(如java),如果这就是你正在使用的。