Dot-Net
查找我自己的 .NET 程序的所有子程序/找出給定程序是否是我自己的子程序?
我有一個 .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(); } } } }