Mein Service braucht ein paar Bits an Informationen zu speichern (mindestens mindestens 20 Bits oder so, aber ich kann einfach die Verwendung von mehr machen), so dassWie emmiere shm_open unter Windows?
- es bleibt über Dienst neu gestartet wird, selbst wenn der Dienst abgestürzt oder wurde sonst nicht normal beendet
- es über einen Neustart nicht persistieren kann mit sehr wenig Aufwand
Wenn ich diese Information in der Registrierung oder in einer Datei gelesen und aktualisiert werden, wird es nicht automatisch entleeren d wenn das System neu startet.
Nun, wenn ich auf einem modernen POSIX-System, würde ich shm_open
, die ein Shared-Memory-Segment schaffen würden, die sie über Prozess neu gestartet werden weiterhin bestehen aber nicht System neu startet, und ich shm_unlink
es zu bereinigen, verwenden könnte, wenn die persistenten Daten wurde irgendwie korrumpiert.
Ich fand MSDN : Creating Named Shared Memory und fing an, Stücke davon innerhalb meines Dienstes neu zu implementieren; Dies verwendet im Wesentlichen CreateFileMapping(INVALID_HANDLE_NAME, ..., PAGE_READWRITE, ..., "Global\\my_service")
anstelle von shm_open("/my_service", O_RDWR, O_CREAT)
.
Allerdings habe ich ein paar Bedenken, vor allem in Bezug auf die Lebensdauer dieser Auslagerungsdatei Backed-Mapping. Ich habe keine Antworten auf diese Fragen in der MSDN-Dokumentation gefunden:
Wenn es über Reboots bleibt oder verschwindet, wenn nicht referenziert, oder nicht manuell zurückgesetzt werden kann, ist diese Methode für mich nutzlos.
Können Sie Fehler in diesen Punkten überprüfen oder finden und/oder einen anderen Ansatz empfehlen?
Wenn es ein Verzeichnis waren, die bei einem Neustart werden gereinigt garantiert wurden, konnte ich es Daten in einer temporären Datei speichern, aber es wäre immer noch nicht ideal sein: unter bestimmten Systemlasten, wir stoßen Datei Öffnen/Schreiben Fehler (selten, unter 0,01% der Zeit, aber immer noch passiert), und diese Funktionalität wird im Protokollierungsweg verwendet werden. Ich möchte hier keine weiteren Dateioperationen einführen.
Vielen Dank für die Bestätigung, dass mein aktueller Ansatz fehlerhaft ist; Ich kam zu diesem Schluss, stellte es aber noch einmal auf die Probe. 'REG_OPTION_VOLATILE' in' HKLM' sieht wie eine gute Passform aus, ich muss nur einige interne Registry-Wrapper bearbeiten. – ephemient