2009-02-01 14 views
6

प्रक्रिया के दौरान संसाधनों को कैसे हटाया जा सकता है, उदाहरण के लिए, कार्य प्रबंधक? प्रक्रिया बंद होने से पहले एक समारोह को कॉल करने का कोई तरीका है?प्रक्रिया समाप्ति पर संसाधनों को हटा दें

+0

मैंने अपना उत्तर – ChrisW

उत्तर

8

आपकी प्रक्रिया में मारे जाने पर वास्तव में कुछ भी नहीं कर सकता है। परिभाषा के अनुसार, एक प्रक्रिया को मारना बस इतना है - इसे मारना। प्रक्रिया को किसी भी कोड को चलाने का मौका नहीं मिलता है। यह "डिजाइन द्वारा" बहुत अधिक है।

कल्पना कीजिए कि आप उस दिनचर्या को पंजीकृत कर सकते हैं जिसे उपयोगकर्ता द्वारा आपकी प्रक्रिया में मार डाला गया था (या किसी अन्य प्रक्रिया द्वारा)। यह क्या करेगा आपकी प्रक्रिया में मौजूद सभी अन्य थ्रेड एक अनिश्चित स्थिति में होंगे, आप उनके साथ सिंक्रनाइज़ कैसे करेंगे? याद रखें, विचार यह है कि प्रक्रिया को मारने की जरूरत है।

अन्य परिदृश्य भी कठिन है: आपका कोड सौम्य है और सही काम करने की कोशिश कर रहा है - उदा। साफ करें और एक अच्छा सिस्टम नागरिक बनें। कुछ कोड नहीं है। कल्पना करें कि एक मैलवेयर लेखक के लिए वरदान क्या होगा यदि ओएस को मारने वाली प्रक्रिया के लिए कोड चलाने की अनुमति दी जाए। यह दुर्भावनापूर्ण प्रक्रियाओं के लिए पर्याप्त खराब होगा जो मानक उपयोगकर्ता विशेषाधिकारों के साथ चल रहे थे, और प्रशासनिक विशेषाधिकारों के साथ चलने के लिए पूरी तरह से भयानक थे।

गंभीर अंतिम रूप और संरचित अपवाद हैंडलिंग इस मौलिक मुद्दे को हल नहीं करेगा।

ऊपर की तरफ, ओएस आपके संसाधनों की हत्या के दौरान सभी संसाधनों को मुक्त कर देगा, अर्थात् स्मृति और कर्नेल ऑब्जेक्ट्स। वे रिसाव नहीं करेंगे। लेकिन एक्सप्लोरर को आपकी प्रक्रिया के बारे में पता नहीं है, इसलिए यह इसके लिए साफ नहीं हो सकता है।

इसे हल करने का एक तरीका एक निगरानी प्रक्रिया होगी जो आपके अन्य प्रक्रियाओं के राज्य को ट्रैक रखती है और इसके लिए साफ हो जाती है। आप इसे एक साधारण प्रक्रिया, या एक सेवा के साथ कर सकते हैं। आप किसी प्रकार के खोल विस्तार पर भी विचार कर सकते हैं जिसकी अपनी धागा थी जो वही काम करती थी।

1

सैद्धांतिक रूप से ओ/एस प्रक्रिया को मारने के बाद संसाधनों को रद्द कर देना चाहिए। विशेष रूप से आप किस प्रकार के संसाधन के बारे में सोच रहे हैं?


संपादित करें:

ठीक है, यह थोड़े समझाने के लिए मुश्किल है। मैं एक लाइब्रेरी का उपयोग कर रहा हूं जो कुछ शैल एक्सटेंशन प्रबंधित करने के लिए कुछ ओएस फ़ंक्शंस लपेट रहा है। जब एप्लिकेशन स्पष्ट रूप से उपयुक्त विधियों को कॉल किए बिना बंद हो जाता है, तो सभी एक्सप्लोरर जमा हो जाते हैं और मुझे इसे पुनरारंभ करने की आवश्यकता होती है।

कोई भी अप्रबंधित डीएलएल (दस्तावेज़ीकरण के अनुसार) DLL_PROCESS_DETACH ईवेंट के साथ लागू किया जाना चाहिए; हालांकि, यह DLL_PROCESS_DETACH ईवेंट को तब नहीं कहा जाता है जब प्रक्रिया TerminateProcess API के माध्यम से समाप्त हो जाती है।

these terms लिए Googling कर दिया The Old New Thing : Why can't you trap TerminateProcess? जो कहते हैं, सब कुछ आप की कोशिश कर रहे क्योंकि "एक बार जब आप TerminateProcess साथ मार डालते हैं, कोई और अधिक उपयोगकर्ता के मोड कोड है कि इस प्रक्रिया में चला जाएगा। यह चला गया।"

उपयोगकर्ता मोड में (यानी .NET, एक्सप्लोरर, शैल, COM) के साथ काम हो रहा है, मुझे लगता है कि जवाब यह है कि आप जो चाहते हैं उसे करने का कोई तरीका नहीं है।

इसके बजाए, शायद एक और तरीका है: उदाहरण के लिए, अपने शैल एक्सटेंशन में कोड जोड़कर ताकि वे महसूस कर सकें कि आपकी प्रक्रिया का पालन किया गया है या नहीं।

+0

संपादित करके अपनी टिप्पणी का उत्तर दिया ठीक है, यह समझाने में थोड़ी मुश्किल है। मैं एक लाइब्रेरी का उपयोग कर रहा हूं जो कुछ शैल एक्सटेंशन प्रबंधित करने के लिए कुछ ओएस फ़ंक्शंस लपेट रहा है। जब एप्लिकेशन स्पष्ट रूप से उपयुक्त विधियों को कॉल किए बिना बंद हो जाता है, तो सभी एक्सप्लोरर जमा हो जाते हैं और मुझे इसे पुनरारंभ करने की आवश्यकता होती है। – user57528

+0

DLL_PROCESS_DETACH को टर्मिनप्रोसेस के कारण समाप्त होने पर DllMain को पास नहीं किया जाता है। –

+0

धन्यवाद बैरी: मैं तदनुसार अपना जवाब संपादित करूंगा। – ChrisW

0

आप अपनी पूरी प्रक्रिया को एक कोशिश/अंत में कथन में लपेटने का प्रयास कर सकते हैं (आप अंततः खंड में डेलोकेशन सामान डालते हैं), लेकिन कुछ मामलों में भी यह पर्याप्त नहीं होगा।

दरअसल, मुझे लगता है कि आप अपनी सामग्री से पृष्ठभूमि थ्रेड लॉन्च कर सकते हैं ताकि सभी चीजें और थ्रेड। जॉइन() आपके मुख्य थ्रेड के साथ हो ताकि अगर बच्चे के धागे में कुछ गलत हो जाए, तो मुख्य धागा अभी भी सक्षम होगा चीजों को सही करने के लिए। बेशक, यह काम नहीं करेगा अगर पूरी प्रक्रिया किसी कारण से समाप्त हो जाती है।

आप एक बाल प्रक्रिया भी लॉन्च कर सकते हैं और Process.WaitForExit() पर कॉल कर सकते हैं, लेकिन मुझे यकीन नहीं है कि आपकी शैल-संबंधित चीज बहु-प्रक्रिया दृष्टिकोण के साथ काम कर सकती है या नहीं।

4

TerminateProcess पर कॉल द्वारा मारने वाले किसी प्रक्रिया के दौरान मनमाने ढंग से कोड निष्पादित करने का कोई तरीका नहीं है, जैसे टास्क मैनेजर, या अन्य प्रक्रिया उपयोगिता जैसे कि टीएसकेआईएल या तास्किल।

न तो महत्वपूर्ण फ़ाइनलाइजर्स, न ही सामान्य फ़ाइनलाइजर्स, न ही कोशिश/आखिरकार ब्लॉक, और निश्चित रूप से केवल 0 ऑब्जेक्ट्स जो IDisposable लागू करते हैं, इस परिदृश्य में कोड निष्पादित नहीं कर सकते हैं। यहां तक ​​कि डीएलएल डिटेच इवेंट्स को TerminateProcess के माध्यम से एक प्रक्रिया समाप्ति से भी नहीं बुलाया जाएगा।

सबसे अच्छा आप एक वॉचडॉग प्रक्रिया का उपयोग करना है जो आपकी मूल प्रक्रिया पर नज़र रखता है और मूल प्रक्रिया समाप्त होने पर प्रासंगिक कोड निष्पादित करता है।

संबंधित मुद्दे