2009-07-10 6 views
3

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:

  • Ist das Mapping über Neustarts hinweg bestehen?
  • Wenn nicht, verschwindet das Mapping, wenn alle offenen Handles geschlossen sind?
  • Wenn nicht, gibt es eine Möglichkeit, das Mapping zu entfernen oder zu löschen? Muss nicht sein, während es benutzt wird.
  • 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.

    Antwort

    1

    Die Shared Memory-Zuordnung bleibt bei Neustarts nicht erhalten und verschwindet, wenn alle Handles geschlossen sind. Ein Memory-Mapping-Objekt ist ein Kernel-Objekt - es wird immer gelöscht, wenn der letzte Verweis auf sie entfernt wird, entweder explizit über ein CloseHandle oder wenn der Prozess, der die Referenz enthält, beendet wird.

    Versuchen Sie, einen Registrierungsschlüssel mit RegCreateKeyEx mit REG_OPTION_VOLATILE zu erstellen - die Daten werden nicht beibehalten, wenn die entsprechende Struktur entladen wird. Dies wird bei Systemabschaltung für HKLM oder Benutzerabmeldung für HKCU sein.

    +0

    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

    -1

    klingt wie vielleicht möchten Sie Serialisierung statt Shared Memory? Wenn das für Ihre Anwendung tatsächlich angemessen ist, hängt die Art der Serialisierung von Ihrer Sprache ab. Wenn Sie C++ verwenden, überprüfen Sie boost :: serialize.C# hat zweifellos viele Serialisierungsoptionen (wie Java), wenn Sie das verwenden.

    +0

    Serialisierung ist nicht das Problem; Das Problem besteht darin, dass die Lebensdauer der serialisierten Daten genau richtig ist. – ephemient