C#关闭进程树

Windows并不维护进程间的父子关系链,而是提供了另外一个妥协的办法 - Job对象。你可以自己维护相关的多个进程,或把多个进程放入一个Job对象中,以便统一管理。Windows task manager中"End Process" & "End Process Tree"分别对应kill掉一个单独的进程和一个进程树。关闭一个进程树,与之所有相关的进程也被关闭了;通常,Windows task manager中关闭一个父进程,其子进程不会被关闭(Windows并不维护进程间的父子关系链)。
 
分析进程的工具Process explorer:  http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx
 
可以通过以下代码来实现关闭一个进程树:
[c-sharp]  view plain copy
  1. using System;  
  2. using System.Diagnostics;  
  3. using System.Globalization;  
  4. using System.Management;  
  5.   
  6. namespace xxx  
  7. {  
  8.     public static class ProcessesKiller  
  9.     {  
  10.         public static void FindAndKillProcess(int id)  
  11.         {  
  12.             killProcess(id);  
  13.         }  
  14.   
  15.         public static void FindAndKillProcess(string name)  
  16.         {  
  17.             foreach (Process clsProcess in Process.GetProcesses())  
  18.             {  
  19.                 if ((clsProcess.ProcessName.StartsWith(name, StringComparison.CurrentCulture)) || (clsProcess.MainWindowTitle.StartsWith(name, StringComparison.CurrentCulture)))  
  20.                     killProcess(clsProcess.Id);  
  21.             }  
  22.         }  
  23.   
  24.         private static bool killProcess(int pid)  
  25.         {  
  26.             Process[] procs = Process.GetProcesses();  
  27.             for (int i = 0; i < procs.Length; i++)  
  28.             {  
  29.                 if (getParentProcess(procs[i].Id) == pid)  
  30.                     killProcess(procs[i].Id);  
  31.             }  
  32.   
  33.             try  
  34.             {  
  35.                 Process myProc = Process.GetProcessById(pid);  
  36.                 myProc.Kill();  
  37.             }  
  38.             // process already quited  
  39.             catch (ArgumentException)  
  40.             {  
  41.                 ;  
  42.             }  
  43.   
  44.             return true;  
  45.         }  
  46.   
  47.         private static int getParentProcess(int Id)  
  48.         {  
  49.             int parentPid = 0;  
  50.             using (ManagementObject mo = new ManagementObject("win32_process.handle='" + Id.ToString(CultureInfo.InvariantCulture) + "'"))  
  51.             {  
  52.                 try  
  53.                 {  
  54.                     mo.Get();  
  55.                 }  
  56.                 catch (ManagementException)  
  57.                 {  
  58.                     return -1;  
  59.                 }  
  60.                 parentPid = Convert.ToInt32(mo["ParentProcessId"], CultureInfo.InvariantCulture);  
  61.             }  
  62.             return parentPid;  
  63.         }  
  64.     }  
  65. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值