2009-03-23 10 views
1

私のプログラムはプロセスを開始します。プログラムを再実行するには、そのプロセスが強制終了されていることを確認する必要があります。これを行うには、プロセスの開始時刻をミューテックスのようなものに保存しておき、後でその名前と開始時刻に一致するプロセスがあるかどうかを確認することができます。システムワイド永続ストレージ?

どうすればいいですか?私は本当にユーザーがログアウトした後に固執するハードドライブに何かを張りたいとは思わない。

参考のために私は、プロセス名は、C#と.NET

+0

チェックアウト:[PersistentDictionary'](http://izlooite.blogspot.com/2011/04/persistent-dictionary.html)クラス –

答えて

4

あなたは、プロセスIDを保存するのではない使用して、時間を開始しています。それはプロセスを殺すのが簡単になります。 ファイルを%TMP%で保存することができます。これにより、ハードドライブの空き領域が少なくなったときにクリーンアップされます。プロセスを殺すために

C#のコードは次のようになります。

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

あなたはこのような%TMP%ディレクトリを見つけることができます。

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

EDIT:PIDを再利用することができ、あなたので、それにも対処する必要があります。

+0

素晴らしい、ありがとう!どのようにして%tmp%に保存するのですか?ファイルストリームを作成して書き込みますか? – Malfist

+0

duh!私は知っていたはずです、pid。 *ヘッドデスク* – Malfist

+0

WindowsはプロセスIDを再利用しないことをWindowsが保証しますか?そうでなければ、名前も必要になります。 –

2

私はrossfabricantに、プロセスIDを名前の代わりに格納する必要があることに同意します。プロセスIDは、再起動するまで再利用されないため、安全です。

ただし、ストレージにTMP環境変数を使用しないで、代わりにIsolated Storageを参照することをおすすめします。これは、ストレージの観点から見ればより多くの.NETになります。また、アプリケーションを実行するために必要なセキュリティも低下します。

残念ながら、一時ディレクトリと隔離されたストレージの両方がログアウト後も保持されるため、このケースを処理するロジックが必要になります。 (しかし、あなたのアプリはシャットダウン時に情報を消去することができます)。

開始するプロセスのコードにアクセスできる場合は、アプリケーションが実行されているかどうかを検出するために、名前付きパイプや共有メモリなどを使用する方がよい場合があります。これはまた、プロセスをシャットダウンするためのきれいな方法を提供します。プロセスを終了させることは最後の手段でなければなりません。一般的に、私は、設計がすべて回避できればプロセスを終了させる必要があるアプリケーションを構築しません。

+0

私は開始しているプロセスを制御できません。私はplink(puTTYスイートから)を開始しています。なぜなら、起動する前にプロセス名plinkのプロセスを強制終了したくないからです。しかし、もしpidと名前が一致すれば、それはおそらく私のものです。 – Malfist

+0

再起動する前にプロセスIDを再利用することができます。この事実をSystem.Diagnostics.Processのドキュメントでも言及しています - http://msdn.microsoft.com/en-us/library/system.diagnostics.process.id.aspx – Moose

+0

ムース:訂正していただきありがとうございます。私それを認識していなかった。 –

関連する問題