gpt4 book ai didi

windows - 如何在 Windows 上模拟 shm_open?

转载 作者:可可西里 更新时间:2023-11-01 09:39:02 26 4
gpt4 key购买 nike

我的服务需要存储一些信息(至少,至少 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% 的时间,但仍然会发生),并且此功能将在日志记录路径中使用。文件操作在此不再赘述。

最佳答案

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

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

关于windows - 如何在 Windows 上模拟 shm_open?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1111152/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com