Monday 15 March 2010

shell - SIGALRM waits for subshell processes? -


यहाँ अनपेक्षित स्थिति है: निम्न स्क्रिप्ट में, SIGALRM फ़ंक्शन को नहीं लाता < कोड> अलार्म () अपेक्षित समय पर।

  #! / Bin / sh -x अलार्म () {गूंज "चिंतित !!!" } जाल अलार्म 14 OUTER = $ (exec sh -c 'इको $ पीपीआईडी') # `एलएस $ 0` में आरजी के लिए; एलएस $ 0 करो | एआरजी पढ़ते समय; INNER = $ (exec sh -c 'echo $ PPID') # बच्चा ए, टाइमर नींद 1 & amp; amp; मार -14 $ $ & amp; # बच्चे बी, कुछ अन्य स्क्रिप्ट 60 & amp; रुको $!   

उम्मीद : 1 सेकंड के बाद, फ़ंक्शन अलार्म () को कॉल किया जाना चाहिए।

असल में : अलार्म () को 60 के दशक तक बुलाया जाता है, या जब हम Ctrl + C दबाते हैं।

हम स्क्रिप्ट में जानते हैं, $$ वास्तव में OUTER प्रक्रिया इंगित करता है, इसलिए मुझे लगता है कि 1 सेकंड के बाद स्क्रीन पर मुद्रित स्ट्रिंग को देखना चाहिए। हालांकि, जब तक कि बच्चे बी के बाहर निकलते हैं, हम देखते हैं कि अलार्म () कहा जाता है।

जब हम trap लाइन प्राप्त करते हैं, तो पूरे कार्यक्रम बस 1 सेकंड के बाद समाप्त तो ... मुझे लगता है कि SIGALRM कम से कम प्राप्त होता है, लेकिन यह क्रियाओं का आह्वान क्यों नहीं करता?

और, एक प्रश्न के रूप में, यह का डिफ़ॉल्ट व्यवहार है SIGALRM समापन हो सकता है? मुझे बताया गया है कि डिफ़ॉल्ट रूप से इसे अनदेखा कर दिया जाता है, इसलिए इसे प्राप्त करने के बाद क्यों OUTER बाहर निकलता है?

bash आदमी पृष्ठ से:

यदि एक आदेश पूरा करने के लिए कमांड की प्रतीक्षा कर रही है और एक संकेत प्राप्त किया गया है जिसके लिए एक जाल निर्धारित किया गया है, तो जाल निष्पादित नहीं किया जाएगा जब तक कि कमांड पूर्ण नहीं हो जाता। जब प्रतीक्षा इंतजार के माध्यम से एशिन्रोनस कमांड के लिए इंतजार कर रहा है, तो एक सिग्नल का रिसेप्शन जिसके लिए एक जाल स्थापित किया गया है, उसे तुरंत इंतजार करने के लिए 128 से अधिक की एक एक्जिट स्थिति के साथ तुरंत वापसी करने का कारण होगा, जिसके तुरंत बाद जाल निष्पादित होगा। / I>

आपकी मूल स्क्रिप्ट पहले परिदृश्य में है Subshell (जबकि पढ़ा हुआ लूप) ने प्रतीक्षा करें को बुलाया है, लेकिन शीर्ष स्तरीय स्क्रिप्ट सिर्फ सबशेल्ड के लिए इंतजार कर रहा है, इसलिए जब यह संकेत प्राप्त होता है, तो सबस्केल पूर्ण होने तक जाल निष्पादित नहीं होता है। यदि आप kill -s 14 $ INNER के साथ सबशेल्ड को संकेत भेजते हैं, तो आपको वह व्यवहार मिलता है जिसे आप उम्मीद करते हैं।

No comments:

Post a Comment