2011-08-25 13 views
6

मेरे पास एक .NET क्लास लाइब्रेरी है जो एक द्वितीयक प्रक्रिया को स्पिन करती है जो तब तक चलती रहती है जब तक कि मैं ऑब्जेक्ट का निपटान नहीं करता।अपनी खुद की .NET प्रक्रिया की सभी बाल प्रक्रियाओं को ढूंढें/पता लगाएं कि क्या दी गई प्रक्रिया मेरे बच्चे हैं?

मेमोरी में प्रोग्रामिंग कार्यक्रम की कुछ घटनाओं के कारण, मैंने यह सुनिश्चित करने के लिए एकीकरण परीक्षण जोड़ने का निर्णय लिया है कि यदि मैं ऑब्जेक्ट को जीसी/फाइनलाइजेशन में समाप्त कर देता हूं, तो यह प्रक्रिया समाप्त हो जाती है।

हालांकि, प्रक्रिया Mercurial कमांड लाइन क्लाइंट है, और मेरा बिल्ड सर्वर पहले से ही अपने परिचालन के हिस्से के रूप में Mercurial चला रहा है, मैं उन स्थितियों की कल्पना करता हूं जहां Mercurial पहले से ही चल रहा है जब यह परीक्षण शुरू होता है, या यह शुरू हो गया है , और अभी भी चल रहा है, जब परीक्षण समाप्त होता है, बिल्ड सर्वर के संबंध में, और मेरा परीक्षण नहीं।

तो, मुझे यकीन है कि मर्क्युरियल ग्राहक मुझे लगता है (या नहीं) एक मैं शुरू कर दिया है, और न सिर्फ किसी भी ग्राहक वर्तमान में चल रहे बनाना चाहते हैं।

तो सवाल यह है:

  • मैं यह कैसे पता कर सकते हैं अगर मर्क्युरियल ग्राहक मैं देख रहा हूँ मेरी प्रक्रिया के द्वारा शुरू किया गया था?

"देखकर", मैं Process.GetProcesses विधि का उपयोग कर देख रहा था, लेकिन यह एक आवश्यकता नहीं है।

यदि कोई अलग प्रश्न बेहतर है, "सभी मेरी अपनी प्रक्रिया की बाल प्रक्रियाओं को कैसे खोजें", यानी। उत्तर देने में आसान, वह भी पर्याप्त से अधिक है।

मुझे यह पृष्ठ मिला: How I can know the parent process ID of a process?, लेकिन ऐसा लगता है कि मुझे इसे प्रक्रिया का नाम देना है। अगर मैं इसे "एचजी" देता हूं, तो क्या वह प्रश्न उस मामले के लिए अस्पष्ट नहीं है जिसे मैं ढूंढ रहा हूं?

उत्तर

16

जैसा कि होता है मेरे पास सी #/डब्लूएमआई कोड का थोड़ा सा हिस्सा होता है जो एक निर्दिष्ट प्रक्रिया आईडी द्वारा उत्पन्न सभी प्रक्रियाओं को मारता है। हत्या स्पष्ट रूप से नहीं है कि आप क्या चाहते हैं, लेकिन बच्चे की प्रक्रिया की खोज होने के लिए क्या आप में रुचि रखते हैं मुझे आशा है कि यह उपयोगी है लगता है:।

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(); 
       } 
      } 
     } 
    } 
+1

यह मेरे लिए खूबसूरती से काम करता था, हालांकि मैं ManagementObject और कोई खोजकर्ता का उपयोग करके एक आसान दृष्टिकोण के लिए गया था। मैं थोड़ी देर के लिए अपने subprocesses को मारने के साथ संघर्ष कर रहा था, धन्यवाद! – Darkhydro

+0

जीवन बचतकर्ता !!!!!! – mstrewe

0

answer of mtijn हालांकि शायद निकटतम आप प्रासंगिकता कर सकते हैं, असली जवाब है: आप नहीं कर सकते।

विंडोज एक असली प्रक्रिया पेड़ नहीं बनाए रखता है जहां मध्यवर्ती स्तर पर एक प्रक्रिया मर जाती है जब प्रक्रियाओं को फिर से संरचित किया जाता है। हालांकि, विंडोज़ माता-पिता प्रक्रिया आईडी को याद रखता है।

मूल प्रक्रिया संरचना:

YourApp.exe 
- SubApp.exe 
    - Second.exe 

तो अब SubApp.exe समाप्त हो जाता है, Second.exe की मूल प्रक्रिया ID अपडेट नहीं किया जाएगा

समस्याग्रस्त मामले निम्नलिखित है। नया परिणाम

YourApp.exe 
Second.exe 

आप SysInternals प्रक्रिया एक्सप्लोरर का उपयोग करके इसे सत्यापित कर सकते हैं। यह प्रक्रियाओं को एक पेड़ के रूप में दिखाने में सक्षम है। सीएमडी शुरू करें, फिर start cmd टाइप करें। नई विंडो में, start cmd फिर से टाइप करें। आपके पास 3 खिड़कियां खुली होंगी। अब मध्य एक को समाप्त करें।