2009-03-23 5 views
1

Mein Programm startet einen Prozess, und ich muss sicherstellen, dass es getötet wird, bevor ich das Programm wieder laufen kann. Um dies zu tun, möchte ich die Startzeit des Prozesses in etwas wie einem Mutex speichern, den ich später abrufen und überprüfen konnte, ob ein Prozess einen passenden Namen und Startzeit hat.Systemweiter persistenter Speicher?

Wie könnte ich das tun? Ich möchte wirklich nichts auf die Festplatte kleben, die sich nach dem Abmelden des Benutzers festhält.

Als Referenz Ich bin mit C# und .NET

+0

Kasse: [ 'PersistentDictionary'] (http://izlooite.blogspot.com/2011/04/persistent-dictionary.html) Klasse –

Antwort

4

Sie mögen den Prozess-ID speichern, nicht der Prozessnamen und Uhrzeit starten. Das wird es einfacher machen, den Prozess zu beenden. Sie können die Datei in% TMP% speichern, damit sie bei niedrigem Festplattenspeicherplatz bereinigt wird.

C# -Code, den Prozess zu töten sieht wie folgt aus:

int pid = Convert.ToInt32(File.ReadAllText(pidFile)); 
    Process proc = Process.GetProcessById(pid); 
    proc.Kill(); 

Sie können die% TMP% Verzeichnis wie folgt ermitteln:

var tmp = Environment.GetEnvironmentVariable("TMP"); 

EDIT: Die PID wiederverwendet werden können, so dass Sie Ich werde mich auch damit befassen müssen.

+0

genial, danke! Wie würde ich es in% tmp% speichern nur einen Filestream erstellen und schreiben? – Malfist

+0

duh! Ich hätte es wissen müssen, pid. * headdesk * – Malfist

+0

Gewährleistet Windows, dass es keine Prozess-IDs wiederverwendet? Wenn nicht, wirst du auch den Namen brauchen. –

2

Ich stimme mit rossfabricant, dass die Prozess-ID anstelle eines Namens gespeichert werden soll. Prozess-IDs werden erst nach einem Neustart wiederverwendet, daher sollte dies sicher sein.

Allerdings würde ich empfehlen, gegen das TMP-Umgebungsvariable für die Speicherung verwenden und stattdessen auf Isolated Storage aussehen. Dies wäre mehr .NET in Bezug auf Speicher ausgerichtet. Außerdem würde dadurch die für die Ausführung Ihrer Anwendung erforderliche Sicherheit verringert.

Leider sowohl temporäre Verzeichnisse und isolierte Speicher werden nach einer Abmeldung bestehen bleiben, obwohl, so dass Sie Logik müssen diesen Fall behandeln. (Ihre App kann jedoch die Informationen zum Herunterfahren bereinigen).

Wenn Sie Zugriff auf den Code des Prozesses haben Sie beginnen, könnte es besser sein, etwas wie Named Pipes zu verwenden oder gemeinsam genutzten Speicher zu erkennen, ob die Anwendung ausgeführt wird. Dies gibt Ihnen auch eine viel sauberere Möglichkeit, den Prozess herunterzufahren. Das Töten eines Prozesses sollte der letzte Ausweg sein - im Allgemeinen würde ich keine Anwendung entwickeln, bei der das Design einen Prozess töten müsste, wenn es überhaupt vermeidbar wäre.

+0

Ich habe keine Kontrolle über den Prozess, den ich beginne. Ich starte plink (aus der puTTY-Suite), weshalb ich keinen Prozess mit dem Prozessnamen von plink beenden will, bevor ich versuche, ihn zu starten. Wenn pid und name übereinstimmen, ist es wahrscheinlich meins. – Malfist

+0

Prozess-IDs können vor einem Neustart erneut verwendet werden. Es erwähnt sogar diese Tatsache in der Dokumentation für System.Diagnostics.Process - http://msdn.microsoft.com/en-us/library/system.diagnostics.process.id.aspx – Moose

+0

Moose: Danke für die Korrektur :) Ich Das hatte ich nicht bemerkt. –

Verwandte Themen