zoukankan      html  css  js  c++  java
  • C#中查找或结束程序域中的主、子进程

    有时候,我们的程序需要启动一些子进程,如嵌入的图形程序。

    当启动一个进程后,获得这个进程信息Process,然后其内部在某个时刻启动了一个子进程,这个时候就涉及程序域和进程树的概念。当我们通过非正常操作的方式结束前面获得的进程信息Process时(如Kill掉),可能并没有实际结束子进程。因为当有主进程启动了子进程后,所有的进程实际上是被放在程序域中运行的(winform的Program文件中的Application域中),而结束的仅仅是域中的某个进程。当然,如果我们正常推出主进程,实际上Application在推出时,做了很多操作,以结束整个域中的信息;如果采用捕捉的Process结束,Application并没有完全执行退出(使用Application的Exit事件,可以检验)。

    如果要完全退出相关进程,就需要查找主进程下的所有子进程,并结束所有进程:

     /// <summary>
     /// 结束进程和相关的子进程
     /// </summary>
     /// <param name="pid">需要结束的进程ID</param>
     public static void KillProcessAndChildren(int pid)
     {
         ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_Process Where ParentProcessID=" + pid);
         ManagementObjectCollection moc = searcher.Get();
         foreach (ManagementObject mo in moc)
         {
             KillProcessAndChildren(Convert.ToInt32(mo["ProcessID"]));
         }
         try
         {
             Process proc = Process.GetProcessById(pid);
             Console.WriteLine(pid);
             proc.Kill();
         }
         catch (ArgumentException)
         {
             /* process already exited */
         }
     }

    查找进程ID的方法:

    //1.根据进程id,获得进程
    Process p = Process.GetProcessById(100);
    //2.获取当前进程
    Process p = Process.GetCurrentProcess();
    //3.根据进程名字获取进程,返回的结果是一个数组
    Process p = (Process.GetProcessesByName("DriverEasy"))[0];

    其中,以上代码需要先引入System.Management.dll(在Framework中找到相关引用);再引入命令空间:System.Management;

      

  • 相关阅读:
    BZOJ 1707 [Usaco2007 Nov]tanning分配防晒霜
    BZOJ2697:特技飞行
    Bridging signals(NlogN最长上升子序列)
    HDU 4291 A Short problem(矩阵+循环节)
    计蒜之道 初赛第一场B 阿里天池的新任务(简单)
    1008: [HNOI2008]越狱
    1022: [SHOI2008]小约翰的游戏John
    1192: [HNOI2006]鬼谷子的钱袋
    2456: mode
    BZOJ-1968
  • 原文地址:https://www.cnblogs.com/pilgrim/p/10831151.html
Copyright © 2011-2022 走看看