2010-01-11 11 views
7

कुछ Win32 ऑब्जेक्ट्स हैं जो एसडीके के अनुसार दिए गए प्रक्रिया द्वारा बनाई गई बाल-प्रक्रियाओं को "विरासत" प्राप्त किया जा सकता है। (घटनाक्रम, म्यूटेक्स, पाइप, ...)इसका क्या अर्थ है: "एक बाल प्रक्रिया संभाल प्राप्त कर सकती है"?

इसका वास्तव में क्या अर्थ है?

मान लें कि मेरे पास नामित ईवेंट ऑब्जेक्ट है, CreateEvent के साथ बनाया गया, एक बार bInheritHandle == true के साथ बनाया गया, और एक और समय == false

अब मैं एक बाल प्रक्रिया शुरू करता हूं। उन दो घटनाओं से निपटने से बच्चे की प्रक्रिया कैसे प्रभावित होती है? वे किस परिदृश्य में भिन्न होते हैं?

उत्तर

13

यदि आप कोई ऑब्जेक्ट बनाते/खोलते हैं और उस हैंडल को विरासत में रखने की अनुमति देते हैं, तो बाल प्रक्रियाएं जिन्हें हैंडल प्राप्त करने की अनुमति है (उदा। आप bInheritHandles = TRUE CreateProcess के लिए निर्दिष्ट कर सकते हैं) में उन हैंडल की प्रतियां होंगी। विरासत वाले हैंडल में समान हैंडल मान होंगे जैसे माता-पिता हैंडल करते हैं। उदाहरण के लिए:

  • CreateEvent एक घटना वस्तु को एक हैंडल देता है, संभाल 0x1234 है।
  • आप उस हैंडल को विरासत में रहने की अनुमति देते हैं।
  • आप एक बाल प्रक्रिया बनाते हैं जो आपके हैंडल को विरासत में लेती है।
  • वह बाल प्रक्रिया या OpenEvent पर कॉल किए बिना 0x1234 हैंडल का उपयोग कर सकती है। उदाहरण के लिए आप बाल प्रक्रिया की कमांड लाइन में हैंडल मान पास कर सकते हैं।

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

+0

लेकिन क्या यह सच नहीं है कि प्रत्येक प्रक्रिया में इसकी स्वयं की हैंडल टेबल है? क्या इसका मतलब यह होगा कि यदि विरासत का उपयोग किया जाता है, तो पूरी संभाल तालिका को नई प्रक्रिया में कॉपी किया जाता है? क्या यह कुछ विशिष्ट वस्तुओं के लिए कुछ बार OpenXxx को कॉल करने से धीमा नहीं है? – bkausbk

+0

@bkausbk: यदि आप अनामित हैं तो आप ऑब्जेक्ट नहीं खोल सकते हैं। – wj32

1

यदि आप कोई ईवेंट बनाते हैं, और हैंडल को बाल प्रक्रियाओं द्वारा विरासत में प्राप्त करने की अनुमति देते हैं, तो बाल प्रक्रिया माता-पिता द्वारा बनाए गए सटीक उसी ऑब्जेक्ट को हैंडल का उपयोग कर सकती है। यह एक ऐसे तरीके से उपयोग किया जा सकता है जहां एक बच्चा एक कार्य पूरा होने पर माता-पिता को सिग्नल करने के लिए इवेंट हैंडल का उपयोग करता है (विरासत घटना ऑब्जेक्ट हैंडल के लिए कई अन्य उपयोग हैं)।

संपादित करें: हटाया गया विघटन।

+0

यदि मैं हैंडल विरासत के बिना एक ही ईवेंट (ओपनएवेंट के माध्यम से) प्राप्त करने का प्रयास करता हूं तो क्या होगा? क्या वह असफल होगा? –

+0

@DR, मुझे नहीं लगता कि यह असफल हो जाएगा, मुझे लगता है कि यह सिर्फ एक नया कार्यक्रम बनाएगा। – dreamlax

+0

यह गलत है। नाम सिस्टम के लिए अनूठे हैं और हैंडल विरासत से प्रभावित नहीं होते हैं। – wj32

2

एक बिंदु जो मौजूदा उत्तरों में नहीं बनाया गया है यह है कि एक बच्चे की प्रक्रिया को हैंडल प्राप्त करने की अनुमति न केवल बाल प्रक्रिया को प्रभावित करती है; यह ऑब्जेक्ट के जीवनकाल को भी प्रभावित कर सकता है जिस पर हैंडल संदर्भित करते हैं। यदि माता-पिता की प्रक्रिया निकलती है, तो बच्चे की प्रक्रिया में हैंडल वस्तु को जीवित रखेगी।

जब बच्चे की प्रक्रिया को संभालने की अनुमति मिलती है तो आपको यह समझना चाहिए कि क्या इसका परिणाम किसी ऑब्जेक्ट से अधिक समय तक जीवित रहना चाहिए; उदाहरण के लिए, कुछ एप्लिकेशन केवल एक ही समय में एक उदाहरण को चलाने की अनुमति देना चाहते हैं, और ऐसा हो सकता है कि किसी दिए गए नाम के साथ ईवेंट ऑब्जेक्ट बनाकर और यह देखकर कि यह पहले से मौजूद है या नहीं। अगर वे एक ऐसी बच्ची प्रक्रिया बनाते हैं जो उस घटना वस्तु को विरासत में ले लेता है, और माता-पिता से बाहर निकलता है, तो इसका परिणाम झूठा सकारात्मक हो सकता है।

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

  • के रूप में गैर दाय सभी हैंडल करें:

    इस कारण से, सबसे अच्छा अभ्यास है।

  • यदि उपप्रोसेसर को हैंडल प्राप्त करने की आवश्यकता नहीं है, FALSEbInheritHandles के लिए पास करें।

  • यदि उपप्रोसेसर को हैंडल, only allow it to inherit those specific handles that are needed प्राप्त करने की आवश्यकता होती है।

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

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