2010-07-26 9 views
2

하위 프로세스를 여는 상위 프로세스가 있습니다. 상위 프로세스가 더 이상 실행되지 않는 경우에만 일부 기능을 수행해야합니다.상위 프로세스 및 하위 프로세스 관계

상위 프로세스가 실행되고 있지 않다는 것을 아는 가장 좋은 방법은 무엇입니까? 그것은 강력하게 종료 될 수 있기 때문에 닫는 이벤트에서 내 자식 프로세스에 신호를 보낼 일부 기능을 만들고 싶지 않습니다.

부모에

이을하고 아이 Process.GetCurrentProcess().Id 에 전달 그리고 아이의 모든 몇 밀리 초이 하나

Process localById = Process.GetProcessById(1234); 

어떤 아이디어를 확인 :

또는

그냥처럼 내 부모 프로세스를 찾고 ? 권장 사항 ..

+2

음은 ... 보통은 부모 프로세스입니다. 프로세스의 성을 실제로 인식하지 않는 한. 건배. –

+0

@AOI Karasu : LOL, 좋은 지적, 나는 그것을 바꾸기 위해 자유를 취했다 (성이 중요하다면, 나의 변화, Night Walker를 되 돌리십시오). – Abel

+0

.NET 용 하위 프로세스 라이브러리를 방금 게시했습니다. http://childprocess.codeplex.com/ –

답변

4

는 id가 명령 줄에서 전달 된 부모 프로세스를 확인하기 위해 Process.WaitForExit를 사용하는 방법을 간단한 예입니다

두 샘플 모두 AutoResetEvent의 목적은 주 스레드가 종료되지 않도록하기위한 것입니다. Windows Forms 응용 프로그램에서는 프로그램을 메시지 루프에 넣고 닫을 때만 종료되므로 사용하지 않아도됩니다.

+0

나는 Process.Exited 예제를 사용했다. 좋은 설명에 정말 감사드립니다. –

4

기본 Win32 프로세스 핸들은 대기 가능하며 프로세스가 종료되면 신호를 보냅니다. 네이티브 코드에서

:

네이티브 코드에서
DWORD res = WaitForSIngleObject(hProcess, INFINITE); 
if (res == WAIT_OBJECT_0) { 
    // process has exited. 
} 

, 당신은 P/호출을 프로세스 처리에 대한 WaitHandle의 사용자 지정 하위 유형을 만들거나 사용 중 하나가 필요합니다. P/Invoke의 단점은 결합하기가 더 어렵다는 것입니다 (WaitForMultipleObjects 여러 번 대기를 사용하므로 하나의 스레드 만 대기하도록 스레드를 할당하지는 않습니다). 0xA3


감사합니다 : 그냥 Process.WaitForExit이 (무기한 대기를 방지하기 위해 제한 시간에 과부하가, 당신의 UI 스레드에서이 작업을 수행하지 않습니다)를 사용합니다.

+0

정말 원시 코드로 가고 싶지 않습니다. –

+1

@ Night Walker : 이렇게하지 않아도됩니다. 단순히 'Process.WaitForExit'을 사용하십시오. 아마 별도의 스레드에서 최고. –

+0

@ 0xA3 : 그리고 때로는 MS가 이미 당신을 위해 일을했습니다 ... – Richard

0

부모 프로세스가 자식 프로세스를 시작하면 명령 줄 인수를 통해 부모 프로세스 ID를 자식에게 전달합니다.

그런 다음 하위 프로세스에서 Process.GetProcessById(int)을 사용하여 상위 프로세스를 가져오고 Process.WaitForExit()을 사용하십시오. 또는 Process.Exited 이벤트를 사용하여 상위 프로세스가 종료 될 때 알림을받습니다. Process.EnableRaisingEventstrue으로 설정해야합니다. 그렇지 않으면 이벤트가 발생하지 않습니다.

using System; 
using System.Diagnostics; 
using System.Threading; 

class Program 
{ 
    static AutoResetEvent _autoResetEvent; 

    static void Main(string[] args) 
    { 
     int parentProcessId = int.Parse(args[0]); 

     _autoResetEvent = new AutoResetEvent(false); 

     WaitCallback callback = delegate(object processId) { CheckProcess((int)processId); }; 
     ThreadPool.QueueUserWorkItem(callback, parentProcessId); 

     _autoResetEvent.WaitOne(); 
    } 

    static void CheckProcess(int processId) 
    { 
     try 
     { 
      Process process = Process.GetProcessById(processId); 
      process.WaitForExit(); 
      Console.WriteLine("Process [{0}] exited.", processId); 
     } 
     catch (ArgumentException) 
     { 
      Console.WriteLine("Process [{0}] not running.", processId); 
     } 

     _autoResetEvent.Set(); 
    } 
} 

Process.Exited 이벤트를 사용하여 다음과 같이 할 수있다 :

using System; 
using System.Diagnostics; 
using System.Threading; 

class Program 
{ 
    static AutoResetEvent _autoResetEvent; 

    static void Main(string[] args) 
    { 
     int parentProcessId = int.Parse(args[0]); 
     Process process = Process.GetProcessById(parentProcessId); 
     process.EnableRaisingEvents = true; 
     process.Exited += new EventHandler(process_Exited); 

     _autoResetEvent = new AutoResetEvent(false); 
     _autoResetEvent.WaitOne(); 
    } 

    static void process_Exited(object sender, EventArgs e) 
    { 
     Console.WriteLine("Process exit event triggered."); 
     _autoResetEvent.Set(); 
    } 
} 
다음
0

양방향 WCF 파이프로 인해 상위 프로세스와 하위 프로세스가 모니터되는 하위 프로세스 관리 라이브러리를 만들었습니다. 자식 프로세스가 종료되거나 부모 프로세스가 종료되면 서로에게 통지됩니다. VS 디버거를 시작된 하위 프로세스에 자동으로 연결하는 디버거 도우미도 사용할 수 있습니다.

양방향 WCF 채널은 확장 가능하며 프로세스 시작 및 프로세스 종료 이벤트를 처리 할 수 ​​있습니다.

프로젝트 사이트 :

http://www.crawler-lib.net/child-processes

NuGet 패키지 :

https://www.nuget.org/packages/ChildProcesses https://www.nuget.org/packages/ChildProcesses.VisualStudioDebug/