2009-03-23 5 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"); 

편집 : PID는 재사용 할 수있는, 당신 때문에 그것도 처리해야합니다.

+0

끝내 주셔서 감사합니다! % tmp %에 파일을 저장하고 파일 스트림을 작성하려면 어떻게해야합니까? – Malfist

+0

duh! 내가 알았어 야 했어. * headdesk * – Malfist

+0

Windows에서 프로세스 ID를 다시 사용하지 않는다고 보장합니까? 그렇지 않다면 이름도 필요합니다. –

2

rossfabricant에 동의합니다. 이름 대신 프로세스 ID를 저장해야합니다. 프로세스 ID는 다시 시작할 때까지 다시 사용되지 않으므로 안전해야합니다.

그러나 저장을 위해 TMP 환경 변수를 사용하지 말고 Isolated Storage을 찾아 보시기 바랍니다. 이것은 더 많은 .NET의 스토리지 측면을 지향합니다. 또한 응용 프로그램을 실행하는 데 필요한 보안을 저하시킵니다.

불행히도 로그 아웃 후에도 임시 디렉토리와 격리 된 저장소가 모두 유지되므로이 경우를 처리하는 논리가 필요합니다. 그러나 앱 종료시 정보를 지울 수는 있습니다.

시작하려는 프로세스 코드에 액세스 할 수있는 경우 명명 된 파이프 또는 공유 메모리와 같은 것을 사용하여 응용 프로그램이 실행 중인지 여부를 확인하는 것이 좋습니다. 이것은 또한 프로세스를 종료하는 훨씬 더 깔끔한 방법을 제공합니다. 프로세스를 죽이는 것은 최후의 수단이되어야합니다. 일반적으로, 피할 수만 있다면 프로세스를 죽이는 것이 필요한 어플리케이션을 빌드하지 않을 것입니다.

+0

내가 시작하는 프로세스를 제어 할 권한이 없습니다. plink (puTTY suite)에서 시작 했으므로, 시작하기 전에 plink라는 프로세스 이름을 가진 프로세스를 죽이는 것을 원하지 않는 이유입니다. 그러나 pid와 이름이 일치하면 아마도 내 것이됩니다. – Malfist

+0

프로세스 ID는 다시 시작하기 전에 다시 사용할 수 있습니다. 심지어이 사실을 System.Diagnostics.Process의 문서에서 언급합니다. - http://msdn.microsoft.com/en-us/library/system.diagnostics.process.id.aspx – Moose

+0

무스 : 수정 해 주셔서 감사합니다. :) 깨닫지 못했다. –