Dot-Net

查找我自己的 .NET 程序的所有子程序/找出給定程序是否是我自己的子程序?

  • April 23, 2021

我有一個 .NET 類庫,它啟動了一個輔助程序,該程序一直執行,直到我處理掉對象。

由於某些程序在記憶體中徘徊,我決定添加一個集成測試,以確保如果我讓對象進入 GC/Finalization,該過程會被停止。

但是,由於該程序是 Mercurial 命令行客戶端,並且我的建構伺服器已經在執行 Mercurial 作為其自身操作的一部分,因此我設想在測試開始時 Mercurial 已經在執行,或者它已啟動但仍在執行的情況執行,當測試完成時,與建構伺服器相關,而不是我的測試。

所以,我想確保我找到(或不是)的 Mercurial 客戶端是我啟動的客戶端,而不僅僅是目前正在執行的任何客戶端。

所以問題是這樣的:

  • 如何確定我正在查看的 Mercurial 客戶端是否由我的流程啟動?

通過“查看”,我正在查看使用Process.GetProcesses方法,但這不是必需的。

如果另一個問題更好,“如何找到我自己程序的所有子程序”,即。更容易回答,一個也綽綽有餘。

我找到了這個頁面:如何知道程序的父程序 ID?,但似乎我必須給它程序名稱。如果我只是給它“hg”,那麼對於我正在尋找的案例來說,這個問題是不是太模棱兩可了?

碰巧我有一些 C#/WMI 程式碼,它會遞歸地殺死由指定程序 ID 生成的所有程序。殺戮顯然不是你想要的,但子程序的發現似乎是你感興趣的。我希望這會有所幫助:

   private static void KillAllProcessesSpawnedBy(UInt32 parentProcessId)
   {
       logger.Debug("Finding processes spawned by process with Id [" + parentProcessId + "]");

       // NOTE: Process Ids are reused!
       ManagementObjectSearcher searcher = new ManagementObjectSearcher(
           "SELECT * " +
           "FROM Win32_Process " +
           "WHERE ParentProcessId=" + parentProcessId);
       ManagementObjectCollection collection = searcher.Get();
       if (collection.Count > 0)
       {
           logger.Debug("Killing [" + collection.Count + "] processes spawned by process with Id [" + parentProcessId + "]");
           foreach (var item in collection)
           {
               UInt32 childProcessId = (UInt32)item["ProcessId"];
               if ((int)childProcessId != Process.GetCurrentProcess().Id)
               {
                   KillAllProcessesSpawnedBy(childProcessId);

                   Process childProcess = Process.GetProcessById((int)childProcessId);
                   logger.Debug("Killing child process [" + childProcess.ProcessName + "] with Id [" + childProcessId + "]");
                   childProcess.Kill();
               }
           }
       }
   }

引用自:https://stackoverflow.com/questions/7189117