2010-01-28 2 views
1

WMI ManagementClass를 사용하여 다른 win32 프로세스를 생성하는 콘솔 응용 프로그램이 있습니다. 사용자가 proc 탐색기를 통해 콘솔 응용 프로그램을 죽이거나 ctrl + c를 눌러 응용 프로그램이 생성 한 모든 자식 프로세스를 종료해야하는 요구 사항이 있습니다. 이것을 극복하는 가장 좋은 방법은?C# 콘솔 응용 프로그램이 중단 될 때 하위 프로세스를 종료하는 방법은 무엇입니까?

답변

3

귀하의 필요 사항을 고려해야한다는 것을 명심하십시오. 아래 샘플처럼 할 수 있습니다.

using System; 
using System.Collections.Generic; 
using System.Diagnostics; 
using System.Linq; 
using System.Text; 

namespace KillSpawnedProcesses 
{ 
    class Program 
    { 
     static List<int> _processes = new List<int>(); 

     static void Main(string[] args) 
     { 
      Console.CancelKeyPress += new ConsoleCancelEventHandler(Console_CancelKeyPress); 

      StartProcesses(); 
      Console.Read(); //to hold up console 
      Console.Read(); //to hold up console 
     } 

     static void Console_CancelKeyPress(object sender, ConsoleCancelEventArgs e) 
     { 
      KillProcesses(); 
     } 

     static void StartProcesses() 
     { 
      for(int i = 0; i < 2; i++) 
      { 
       Process p = new Process(); 
       p.StartInfo = new ProcessStartInfo(); 
       p.StartInfo.FileName = "Notepad.exe"; 
       p.Start(); 
       _processes.Add(p.Id); 
      } 
     } 

     static void KillProcesses() 
     { 
      foreach(var p in _processes) 
      { 
       Process tempProcess = Process.GetProcessById(p); 
       tempProcess.Kill(); 
      }    
     } 
    } 
} 
0

하위 프로세스가 메시지 큐 (Win32에서 메시지 펌핑)가있는 경우, 당신은 그것의 주요 창으로 WM_CLOSE를 게시하거나, 당신의 자신의 메시지를 정의 할 수 있습니다. 그렇지 않으면 이벤트와 같은 소켓, 파이프 또는 동기화 개체를 사용하여 프로세스 간 알림을 디자인 할 수 있습니다.

가장 나쁜 방법은 하위 프로세스를 종료하는 것입니다.