2009-03-23 5 views
1

Моя программа запускает процесс, и мне нужно убедиться, что он был убит, прежде чем я снова смогу запустить программу. Чтобы сделать это, я хотел бы сохранить время начала процесса в виде мьютекса, который позже мог бы получить, и проверить, не имеет ли какой-либо процесс соответствующее имя и время начала.Системное постоянное хранилище?

Как я мог это сделать? Я действительно не хочу вставлять что-либо на жесткий диск, который будет закрываться после выхода пользователя из системы.

Для справки, я использую C# и .NET

+0

Оформить заказ: ['PersistentDictionary'] (http://izlooite.blogspot.com/2011/04/persistent-dictionary.html) класс –

ответ

4

Вы хотите сохранить идентификатор процесса, а не имя процесса и время запуска. Это упростит процесс. Вы можете сохранить файл в% 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

awesome, спасибо! Как я могу сохранить его в% tmp%, просто создайте фильтр и напишите его? – Malfist

+0

duh! Я должен был знать, pid. * headdesk * – Malfist

+0

Гарантирует ли Windows, что он не будет повторно использовать идентификаторы процессов? Если нет, вам тоже понадобится это имя. –

2

Я согласен с rossfabricant в том, что Идентификатор процесса следует хранить вместо имени. Идентификаторы процессов не используются повторно после перезагрузки, поэтому это должно быть безопасным.

Однако я бы рекомендовал не использовать переменную среды TMP для хранения, а вместо этого посмотреть на Isolated Storage. Это будет более ориентировано на .NET с точки зрения хранения. Кроме того, это снизит безопасность, необходимую для запуска вашего приложения.

К сожалению, как временные каталоги, так и изолированное хранилище будут сохраняться после выхода из системы, поэтому вам потребуется логика для обработки этого случая. (Однако ваше приложение может очистить информацию при выключении).

Если у вас есть доступ к коду процесса, который вы запускаете, может быть лучше использовать что-то вроде именованных каналов или разделяемой памяти, чтобы определить, работает ли приложение. Это также дает вам более чистый способ закрыть процесс. Убийство процесса должно быть последним средством - в общем, я бы не создал приложение, в котором дизайн требует убийства процесса, если его вообще можно было бы избежать.

+0

У меня нет контроля над процессом, с которого я начинаю. Я начинаю plink (из пакета puTTY), поэтому я не хочу просто убивать любой процесс с именем процесса plink, прежде чем пытаться его запустить. Однако, если pid и имя совпадают, это, вероятно, мое. – Malfist

+0

Идентификаторы процессов могут быть повторно использованы до перезапуска. Он даже упоминает этот факт в документах для System.Diagnostics.Process - http://msdn.microsoft.com/en-us/library/system.diagnostics.process.id.aspx – Moose

+0

Moose: Спасибо за исправление :) I не понял этого. –

Смежные вопросы