2009-07-10 80 views
3

我的服務需要存儲的信息數位(至少,至少有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%的時間內,但仍然發生),並且此功能將用於日誌記錄路徑。我不想在這裏介紹更多的文件操作。

回答

1

共享內存映射不會在重新啓動時持續存在,並且在其所有句柄都關閉時它將消失。一個內存映射對象是一個內核對象 - 當它們的最後一個引用消失時,它們總是被刪除,顯式地通過CloseHandle或當包含引用的進程退出時。

嘗試使用REG_OPTION_VOLATILE創建一個帶有RegCreateKeyEx的註冊表項 - 當相應的配置單元被卸載時,數據將不會保留。這將在HKLM的系統關閉或HKCU的用戶註銷時進行。

+0

感謝您確認我目前的方法存在缺陷;我剛剛得出這個結論,但還是把它做了測試。 `HKLM`中的`REG_OPTION_VOLATILE`看起來非常合適,我只需要解決一些內部的註冊表包裝。 – ephemient 2009-07-10 19:31:16

-1

聽起來像也許你想序列化,而不是共享內存?如果這確實適合您的應用程序,則序列化的方式將取決於您的語言。如果您使用的是C++,請查看boost :: serialize。C#無疑有很多序列化選項(如java),如果這就是你正在使用的。

+0

序列化不是問題;問題在於獲得序列化數據的生命期完全正確。 – ephemient 2009-07-10 19:32:01