मेरे पास लिनक्स प्रक्रिया के बारे में एक प्रश्न है, और मैं इसका पता नहीं लगा सकता।
यह समस्या "एडवांस बैश स्क्रिप्ट" पुस्तक से आई, कोड यहाँ है:
#! /bin/bash
# spawn.sh
sleep 1
sh $0 # fork a child process here and into infinite loop
exit 0 # the script will never come here
जब मैं दौड़ता हूँ ./spawn.sh शेल में, प्रक्रिया वहां अटक जाएगी, और थोड़ी देर बाद वहां "श स्पॉन.श" प्रक्रियाएं होंगी।
मुझे लगता है कि प्रक्रियाओं के बीच संबंध अब इस तरह है:
./spawn.sh प्रक्रिया (pid: 10000) ---> बच्चे की प्रक्रिया (pid: 10001) ---> बच्चे की प्रक्रिया (pid: 1002) ---> बच्चे की प्रक्रिया (pid: 1003) ---> और इसलिए पर
जब मैं नियंत्रण-सी को शेल में धकेलता हूं, तो मूल प्रक्रिया समाप्त हो जाती है, और इसकी सभी बाल प्रक्रियाएं भी खत्म हो गई हैं। यह वह जगह है जहाँ मैं नहीं समझ सकता। सभी बच्चे क्यों नष्ट हो गए? मुझे लगता है कि प्रक्रियाओं के बीच संबंध होना चाहिए:
init (pid: 1) ---> बाल प्रक्रिया (pid: 10001) ---> बाल प्रक्रिया (pid: 1002) ---> बाल प्रक्रिया (pid: 1003) ---> और इसी तरह
लेकिन तथ्य यह है कि जैसे की अभिभावक प्रक्रिया जब यह खत्म हो जाती है, तो उसे बाल प्रक्रिया के लिए एक संकेत भेजती है, इस प्रकार एक-एक करके सभी बाल प्रक्रियाएं नष्ट हो जाती हैं। क्या यह सामान्य है या शेल स्क्रिप्ट की विशेषता है?
पहले से ही बहुत - बहुत धन्यवाद।
उत्तर:
उत्तर № 1 के लिए 1जब मैं नियंत्रण-सी को शेल में धकेलता हूं, तो मूल प्रक्रिया समाप्त हो जाती है और इसकी सभी बाल प्रक्रियाएं भी खत्म हो गई हैं। यह वह जगह है जहाँ मैं नहीं कर सकता समझना। क्यों सभी बच्चे नष्ट हो गए
जब आप Ctrl-C को हिट करते हैं, तो SIGINT को न केवल मूल प्रक्रिया के लिए, बल्कि संपूर्ण प्रक्रिया समूह में भेजा जाता है। इसका मतलब यह है कि सभी तीन प्रक्रियाओं को एक संकेत मिलता है, इसलिए वे मर जाते हैं। इस क्रिया को देखने के लिए, a जोड़ें
trap "process $$ exiting" INT
यह देखने का एक त्वरित तरीका है कि बच्चे "अपने माता-पिता के प्रति प्रतिक्रिया नहीं करते हैं" निधन एक स्क्रिप्ट को एक ही बच्चे को पालना है और फिर माता-पिता को मारना है।
जवाब के लिए 0 № 2
कंट्रोल-सी सबसे हाल के बच्चे को मार रहा है, मूल शेल नहीं। कब sh $0
बाहर निकलता है, कोड की अगली पंक्ति वर्तमान शेल को बाहर निकलने का कारण बनती है, जो मूल माता-पिता के लिए सभी तरह से पूर्ण प्रक्रियाओं के एक झरना का कारण बनता है।
जवाब के लिए 0 № 3
मुझे लगता है कि मुझे अब जवाब पता है। इसका कारण यह है कि Control-C SIGINT को न केवल शेल स्क्रिप्ट प्रक्रिया, बल्कि इसकी उप प्रक्रियाओं को भी भेजेगा। चूँकि ये प्रक्रियाएँ SIGINT को नहीं फँसाती हैं, इसलिए वे खत्म हो जाती हैं।
आदेश मार डालो -2 Ctrl-C के समान नहीं है, विस्तार के लिए, इसे देखें: http://ajhaupt.blogspot.com/2011/01/whats-difference-between-ctrl-c-and.html
और धन्यवाद सभी लोग मेरी मदद करते हैं :)