2011-07-05 12 views
7

माइक्रोसॉफ्ट यहाँ सुरक्षित खेला। उनके लेख में, "Creating a Child Process with Redirected Input and Output", वे कह रहे हैं:क्या मुझे बाद में बाल प्रक्रिया के स्वामित्व वाले विरासत वाले हैंडल को बंद करना है?

शेष प्रक्रिया को समाप्त होने पर शेष खुले हैंडल साफ़ किए जाते हैं।
एक बड़े आवेदन में संसाधन रिसाव से बचने के लिए, स्पष्ट रूप से बंद हैंडल।

जो पूरी तरह से बेकार है। क्या संभालता है? किस प्रक्रिया में?


मैं इसके चारों ओर अपना सिर प्राप्त करना चाहता हूं।

जब SECURITY_ATTRIBUTES.bInheritHandle = TRUE के साथ मूल प्रक्रिया में एक हैंडल बनाया जाता है, तो एक बाल प्रक्रिया इसे देख और उपयोग कर सकती है, और हैंडल में दोनों प्रक्रियाओं में समान मूल्य और पहुंच अधिकार हैं।

लेकिन क्या यह वही संभाल है, या यह एक प्रतिलिपि है जो समान संख्यात्मक प्रतिनिधित्व करने के लिए होती है?

अगर मैं एक बच्चे की प्रक्रिया के लिए एक hRead संभाल पारित इतना है कि यह एक पाइप से पढ़ सकते हैं, और बच्चे प्रक्रिया संभाल बंद कर देता है, मैं भी माता-पिता की प्रक्रिया से इसे बंद करना चाहिए? क्या यह बाल प्रक्रिया के तहत पाइप को मिटा नहीं देगा?

मेरे प्रयोगों से पता चलता है कि CloseHandle बच्चे को बंद करने के बाद बच्चे को पास किए गए hRead को बंद करने की कोशिश करते समय सफलता प्राप्त होती है। यह हां के लिए जोरदार तर्क देता है, आपको इसे बंद करना चाहिए। हालांकि, मैं यहां एक और ठोस सलाह की सराहना करता हूं।

उत्तर

10

आपने वहां सिर पर नाखून मारा। Win32 हैंडल एक अंतर्निहित कर्नेल मोड ऑब्जेक्ट के लिए उपयोगकर्ता मोड संदर्भ के रूप में कार्य करता है। नए और मौजूदा ऑब्जेक्ट्स को हैंडल (संदर्भ) आमतौर पर किसी प्रकार के CreateXXX कॉल के माध्यम से बनाए जाते हैं - DuplicateHandle पर कॉल करके अतिरिक्त संदर्भों को वर्तमान या अन्य प्रक्रियाओं में बनाया जा सकता है - {या एक हैंडल को विरासत के रूप में चिह्नित करना और एक नई प्रक्रिया बनाना - जो वर्तमान प्रक्रिया से एक संभाल को बाल प्रक्रिया में डुप्लिकेट करता है - यह सुनिश्चित करना कि हैंडल मान समान है।}

उस बिंदु पर, कर्नेल ऑब्जेक्ट के लिए दो संदर्भ (कम से कम) हैं, जिनमें से दोनों को बंद करने की आवश्यकता है ऑब्जेक्ट अनलॉक करें और किसी भी उपभोग वाले संसाधनों को मुक्त करें।

+0

आह। तो जब मैं एक बच्चे की प्रक्रिया पैदा करता हूं तो हैंडल * क्लोन किया जाता है। यही वह था जो मैं बाद में था। – GSerg

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

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