2010-02-25 8 views
21

मैंने एक प्रक्रिया के लिए सिग्नल हैंडलर लिखा, और उसके बाद फोर्क(), सिग्नल हैंडलर दोनों माता-पिता और बाल प्रक्रियाओं पर लागू किया जाएगा। अगर मैं बच्चे की प्रक्रिया को "exec" से प्रतिस्थापित करता हूं, तो सिग्नल हैंडलर अब और नहीं है।"exec" के बाद जीवित रहने के लिए हैंडलर को सिग्नल करना संभव है?

मुझे पता है ऐसा इसलिए होता है क्योंकि "exec" कॉल बाल प्रक्रिया पता स्थान को स्वयं के साथ ओवरराइट कर देगा। मैं सिर्फ यह जानना चाहता हूं कि "exec" कॉल के बाद भी सिग्नल हैंडलर काम करने का कोई तरीका है या नहीं?

उत्तर

25

सं man पृष्ठों से:

execve() सफलता पर वापस नहीं करता है, और पाठ, डेटा, बीएसएस, और फोन करने की प्रक्रिया के ढेर कार्यक्रम लोड की है कि द्वारा ओवरराइट कर रहे हैं। कार्यक्रम को कॉलिंग प्रक्रिया के पीआईडी, और किसी भी खुले फ़ाइल डिस्क्रिप्टर को उत्तराधिकारी दिया गया है जो निष्पादन पर बंद करने के लिए सेट नहीं हैं। कॉलिंग प्रक्रिया पर लंबित सिग्नल साफ़ कर दिए गए हैं। कॉलिंग प्रक्रिया द्वारा पकड़े जाने वाले किसी भी सिग्नल को उनके डिफ़ॉल्ट व्यवहार पर रीसेट कर दिया जाता है। SIGCHLD सिग्नल (जब SIG_IGN पर सेट किया गया हो) SIG_DFL पर रीसेट हो सकता है या नहीं भी हो सकता है।

वास्तव में, यदि संकेत हैंडलर के बाद कोड कुछ बहुत अलग कोड के साथ बदल दिया गया था अभी भी सक्रिय थे, तो आप हिंसा के सभी प्रकार जब सिग्नल हुआ उम्मीद कर सकता है। सिग्नल हैंडलर, आखिरकार, कुछ होने पर कॉल करने के लिए सिर्फ एक पता है (अब SIG_IGN और SIG_DFL छूट)। कौन जानता है कि जब आप पूरे टेक्स्ट सेगमेंट को प्रतिस्थापित करते हैं तो उस पते पर कोड का कौन सा टुकड़ा होगा?

+0

अच्छी तरह से समझाया गया, thanx पैक्स। दरअसल मैं मैन-पेज से गुजर चुका था, बस जानना चाहता था कि इसे कुछ पर्यावरण चर या कुछ के माध्यम से पारित किया जा सकता है। – aditya

+1

SIG_IGN के बारे में क्या? –

+1

@ SIG_IGN के लिए मैट बच्चे सिग्नल को अनदेखा कर देगा। SIG_DFL समझ में नहीं आता है क्योंकि इसमें पहले से ही डिफ़ॉल्ट व्यवहार हैं। – Daniel

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