2013-04-12 5 views
9

Ich bin mir nicht sicher, wie ich vorgehen soll, da ich Beispiele für den gemeinsamen Speicher für Interprozesskommunikation gesehen habe. Ich fragte mich, ob ich es von einem Server aus nutzen könnte, um zum Beispiel periodische Schnappschüsse von bestimmten Objekten zu machen und sie in irgendeinem Format im Shared Memory abzulegen, was ... wenn mein Programm abstürzt..bei Neustart des Programms für teilweise abgerufen werden konnte Wiederherstellung. Ist das machbar? Wenn ja, was kann ich mir ansehen, um loszulegen?Ich habe ein C++ Programm unter Linux, ist es möglich, dass es regelmäßig Snapshots im Shared Memory für die Wiederherstellung nach dem Absturz speichern?

UPDATE: Ich habe irgendwo gelesen, dass Shared Memory auf Linux (ich bin auf Linux) persistent ist, so dass ich dachte, ich könnte in der Lage, Snapshots in regelmäßigen Abständen ohne die Notwendigkeit eines Hilfsprozesses zu speichern. Sagen wir zum Beispiel eine sich ständig aktualisierende Struktur, die ich alle paar Sekunden im Shared Memory ablege. Der Grund, warum ich für geteilten Speicher statt einer Datei optiere, ist rein für die Geschwindigkeit, da der Zustand eine Menge binärer Daten wäre.

+0

Sind Sie auf Windows? Wenn ja, könnten Sie einfach [WER] (http://msdn.microsoft.com/en-gb/library/windows/desktop/bb787181%28v=vs.85%29.aspx) einrichten, um Dumps zu sammeln, wenn Abstürze auftreten – EdChum

+1

dies klingt wie ein Flugschreiber? –

+4

Shared Memory überlebt einen Neustart nicht. Sie müssen die Daten in etwas haltbarerem wie einer Datei speichern. –

Antwort

4

Nur eine Idee (nicht ausprobiert) auf Uni * x ähnliche Systeme.

Führen Sie eine Verzweigung (2) aus und senden Sie ein SIGTRAP-Signal an diesen untergeordneten Prozess (oder eine beliebige signal, die einen Core-Dump erstellt).

Fork erstellt eine Kopie der ursprünglichen Prozessumgebung. Dies wird den gesamten Speicherstatus ausgeben. Dann kann es von gdb (oder ähnlich) analysiert werden. Natürlich ist es nicht für die Wiederherstellung ...

Sie können eine gdbinit Datei erstellen und Sie können die Variablen aus einem Skript mit Aufruf der gdb mit der Kerndatei ausgeben.

Warum wird der gemeinsame Speicher benötigt? Ist es nicht gut, den Zustand auf die Festplatte zu entladen?


Ich denke, dass dies für die Wiederherstellung auch verwendet werden kann. Perl -u Kommandozeilenargument macht ähnliches. Es analysiert die Skriptdatei und speichert eine Kerndatei. Diese Core-Datei kann von undump Programm verwendet werden, um den Kern direkt in den Speicher zu laden und Perl ohne die Parsing-Phase zu starten.

+0

Ich frage mich, ob Shared Memory hierfür schneller wäre (sowohl beim Schreiben der Snapshots als auch beim Zurücklesen) - besonders wenn die Snapshots groß werden.Wenn es nicht so viel schwieriger ist, in Dateien zu schreiben, würde ich mir vorstellen, dass die Entscheidung für den Shared Memory-Ansatz besser wäre. –

+0

@Palace Chan: Tatsächlich können Sie den Speicher des Prozesses lesen lesen die '/ proc//mem' ([info über das] (http://unix.stackexchange.com/questions/6301/how-do-i -read-from-proc-pid-mem-unter-linux)). Oder Sie können einen Dump im Shared Memory ('/ dev/shm') machen, der normalerweise auf'/lib/init/rw' gemountet ist (siehe 'df'). Oder Sie können einen 'neuen' Operator für alle Klassen implementieren, die Sie im Shared Memory speichern möchten, aber dann müssen Sie einen Low-Level-Speichermanager implementieren. Ich empfehle Ihnen, die Core-Dump-Version zu verwenden. – TrueY