2009-03-02 13 views
12

पर सी ++ में "किल प्रोसेस ट्री" के बराबर प्रदर्शन करना हमारे पास एक सी ++ कार्य है जो एक नई प्रक्रिया को फोर्क करेगा। बदले में उस प्रक्रिया में कई बाल प्रक्रियाएं हो सकती हैं। यदि कार्य आवंटित समय से पहले चलता है, तो हम उस फोर्क प्रक्रिया को मारना चाहेंगे। हालांकि, हम उन प्रक्रियाओं को अनाथ नहीं करना चाहते हैं जो इसे पैदा हुए हैं। हम सभी को मरना चाहते हैं। मैंने प्रोसेस एक्सप्लोरर का उपयोग किया है और इसमें विंडोज टास्क मैनेजर के "एंड प्रोसेस ट्री" के समान "किल प्रोसेस ट्री" विकल्प है, इसलिए मैं अनुमान लगा रहा हूं कि ऐसा करने के लिए एक सार्वजनिक एपीआई है। क्या किसी ने ऐसा किया है, या सार्वजनिक एपीआई के संदर्भ के बारे में पता है?विंडोज़

Thx, ब्रेट

+0

मुझे विश्वास है कि कार्य प्रबंधक चीजें हैं जो सार्वजनिक API के माध्यम से उपलब्ध नहीं हैं की एक किस्म है। – jdigital

+0

जबकि मुझे विश्वास करने में कोई समस्या नहीं होगी;) तथ्य यह है कि प्रक्रिया एक्सप्लोरर यह मुझे आश्चर्यचकित करता है। मेरा मानना ​​है कि उस कंपनी को मेरा एमएस हासिल करने से पहले लिखा गया था। –

+0

हाँ, लेकिन जिस व्यक्ति ने प्रोसेस एक्सप्लोरर - मार्क रसेलिनोविच लिखा - वह विंडोज एनटी पर माइक्रोसॉफ्ट के लिए काम करता था (माइक्रोसॉफ्ट द्वारा खरीदी गई कंपनी से पहले) और उसने सचमुच विंडोज इंटर्नल पर पुस्तक लिखी थी। http://www.microsoft.com/learning/en/us/books/12069.aspx –

उत्तर

18

आप "कार्य API" पर विचार करना चाहते हो सकता है। CreateJobObject और दोस्तों। उचित विशेषता निर्धारित करके आप नौकरी के भीतर रहने के लिए बच्चों की प्रक्रियाओं को लागू कर सकते हैं। फिर जब भी आप चाहें TerminateJobObject को कॉल कर सकते हैं।

स्पष्टीकरण: यह कार्य प्रबंधक नहीं करता है।

+1

फॉलो अप करें, अगर वह फोर्कड प्रक्रिया मर जाती है और उसकी नौकरियां अनाथ हो जाती हैं, तो टर्मिनेटजोब ऑब्जेक्ट अभी भी अनाथों को पीछे छोड़ने में सक्षम होगा? –

+2

हां, प्रासंगिक एपीआई दस्तावेज़ देखें। जब तक CREATE_BREAKAWAY_FROM_JOB ध्वज के साथ कोई प्रक्रिया नहीं बनाई गई थी। – EFraim

+2

हालांकि दूर चलना संभव नहीं है यदि नौकरी ऑब्जेक्ट में JOB_OBJECT_LIMIT_BREAKAWAY_OK सीमा सेट नहीं है। – EFraim

4

एक Win32 समारोह TerminateProcess() कहा जाता है। यह आपके लिए नौकरी करना चाहिए।

वैकल्पिक रूप से, मैं taskkill आदेश इस जैसी चीजों के लिए उपयोगी हो पाया है।

taskkill /F /T /IM program.exe 

कोड से :

कमांड लाइन से

system("taskkill /F /T /IM program.exe"); 

अन्य स्विच (सीधे taskkill से /?):

 TASKKILL [/S system [/U username [/P 
[password]]]] 
      { [/FI filter] [/PID processid | /IM imagename] } [/F] [/T] 

Description: 
    This command line tool can be used to end one or more processes. 
    Processes can be killed by the process id or image name. 

Parameter List: 
    /S system   Specifies the remote system to connect to. 

    /U [domain\]user Specifies the user context under which 
          the command should execute. 

    /P [password]  Specifies the password for the given 
          user context. Prompts for input if omitted. 

    /F      Specifies to forcefully terminate 
          process(es). 

    /FI filter   Displays a set of tasks that match a 
          given criteria specified by the filter. 

    /PID process id  Specifies the PID of the process that 
          has to be terminated. 

    /IM image name  Specifies the image name of the process 
          that has to be terminated. Wildcard '*' 
          can be used to specify all image names. 

    /T      Tree kill: terminates the specified process 
          and any child processes which were started by it. 

    /?      Displays this help/usage.

-John

+5

TerminateProcess स्वचालित रूप से सभी बाल प्रक्रियाओं को मार नहीं देता है। – Cray

1

आप जिस प्रक्रिया को मारना चाहते हैं, उसके लिए प्रक्रिया आईडी खोजना चाहते हैं, फिर अपने बच्चों (और उनके बच्चों, और इसी तरह ...) के "पेड़ पर चलें", अपने पिड्स को नोट करें, और फिर अच्छी और जल्दी सभी प्रक्रियाओं को मार डालो।

6

मैं काम वस्तु मार्ग से जा रहा सुझाव देते हैं, जैसा कि ऊपर संकेत दिया है, यह सबसे विश्वसनीय हो जाएगा। यदि आप जॉब ऑब्जेक्ट रूट नहीं जा सकते हैं, तो आप टूललप एपीआई का उपयोग मूल प्रक्रिया आईडी प्राप्त करने और उस तरह पेड़ का निर्माण करने के लिए कर सकते हैं। सावधान रहें, क्योंकि विंडोज के पास मजबूत माता-पिता/बाल संबंध नहीं हैं और पीआईडी ​​के पुनर्नवीनीकरण के लिए यह संभव है। आप प्रक्रिया के निर्माण समय की क्वेरी करने के लिए GetProcessTimes का उपयोग कर सकते हैं, और जांच सकते हैं कि यह बच्चे से बड़ा है। यदि पेड़ में एक मध्यवर्ती प्रक्रिया समाप्त हो जाती है, तो आप पेड़ को और आगे नहीं चल पाएंगे।

// Error handling removed for brevity 
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
PROCESSENTRY32 process; 
ZeroMemory(&process, sizeof(process)); 
process.dwSize = sizeof(process); 
Process32First(snapshot, &process); 
do 
{ 
    // process.th32ProcessId is the PID. 
    // process.th32ParentProcessID is the parent PID. 

} while (Process32Next(snapshot, &process)); 
+1

हां, यह वही है जो आपको Vista पर उपयोग करने की आवश्यकता होगी। –

+0

आपको XP पर भी इसकी आवश्यकता होगी। – bltxd