我的服務需要存儲的信息數位(至少,至少有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