शेल किसी प्रोग्राम को कैसे निष्पादित करता है?


11

अगर मैं gcc का उपयोग करके किसी प्रोग्राम को संकलित करता हूं, और इसे bash शेल से निष्पादित करने का प्रयास करता हूं, तो इसे निष्पादित करने के लिए bash द्वारा चरणों का सटीक क्रम क्या है?

मैं पता fork(), execve(), loader, dynamic linker(और अन्य चीजों) शामिल कर रहे हैं, लेकिन किसी को कर सकते हैं चरणों में से एक सही अनुक्रम और कुछ उपयुक्त पढ़ने संदर्भ दे सकता है?

संपादित करें:

जवाब से, ऐसा लगता है कि सवाल कई संभावनाओं को जन्म दे सकता है। मैं एक साधारण मामले को संकुचित करना चाहता हूं:

(test.c सिर्फ हैलो वर्ल्ड प्रिंट करता है)

$ gcc test.c -o test
$ ./test

उपरोक्त मामले में कदम क्या होंगे ( ./test), विशेष रूप से किसी बच्चे की प्रक्रिया में बैश शुरू करने के कार्यक्रम, लोडिंग, लिंकिंग आदि से संबंधित?


4
मैं आपको lwn.net/Articles/630727
cuonglm

3
क्यों नहीं `स्ट्रेस बैश -सी 'टेस्ट' की कोशिश की?
सेर्गेई कोलोडियाज़नी

2
ऐसा लगता है कि ओप के लिए एक अच्छा ऑपरेटिंग सिस्टम पाठ्यपुस्तक एक अच्छा संसाधन होगा। इस तरह के व्यक्तिगत सवाल पूछकर ऑपरेटिंग सिस्टम कैसे काम करता है, यह सीखने की कोशिश एक उत्पादक प्रक्रिया होने की संभावना नहीं है।
बमर

शेल का न्यूनतम उदाहरण देखना उपयोगी होगा: brennan.io/2015/01/16/write-a-shell-in-c
jinawee

जवाबों:


5

ठीक है, सटीक क्रम अलग-अलग हो सकता है, क्योंकि एक शेल उर्फ ​​या फ़ंक्शन हो सकता है जो वास्तविक कार्यक्रम को निष्पादित करने से पहले पहले विस्तारित / व्याख्या हो जाता है, और फिर एक योग्य फ़ाइल नाम के लिए अंतर ( /usr/libexec/foo) बनाम ऐसा कुछ जिसे सभी निर्देशिकाओं के माध्यम से देखा जाएगा। के PATHवातावरण चर (बस foo)। इसके अलावा, निष्पादन का ब्यौरा, मामलों को मुश्किल हो सकती है के रूप में foo | bar | zot(के कुछ नंबर खोल लिए और अधिक काम की आवश्यकता है fork(2), dup(2)ज़ाहिर है, और,, pipe(2), अन्य सिस्टम कॉल के बीच) है, जबकि कुछ ऐसे exec fooबहुत कम काम है के रूप में खोल केवल के साथ खुद को बदल देता है नया कार्यक्रम (यानी, ऐसा नहीं है fork)। इसके अलावा महत्वपूर्ण प्रक्रिया समूह हैं (विशेषकर अग्रभूमि प्रक्रिया समूह, जिनमें से सभी पीआईडी ​​खाते हैंSIGINTजब कोई व्यक्ति Ctrl+ Cसत्रों, और चाहे वह कार्य पृष्ठभूमि में चलाया जा रहा हो, निगरानी ( foo &) या पृष्ठभूमि, अनदेखा ( foo & disown) करने लगता है। I / O पुनर्निर्देशन विवरण चीजों को भी बदल देगा, उदाहरण के लिए, यदि मानक इनपुट शेल ( foo <&-) द्वारा बंद है , या क्या फ़ाइल को स्टडिन ( foo < blah) के रूप में खोला गया है ।

straceया इस प्रक्रिया के साथ किए गए विशिष्ट सिस्टम कॉल के बारे में जानकारीपूर्ण होगी, और उनमें से प्रत्येक कॉल के लिए मैन पेज होने चाहिए। उपयुक्त प्रणाली स्तर की रीडिंग स्टीवंस की "UNIX पर्यावरण में उन्नत प्रोग्रामिंग" से किसी भी संख्या में होगी, जबकि एक शेल बुक (उदाहरण के लिए, "बैश से जेड शेल के लिए") चीजों के शेल पक्ष को और अधिक विस्तार से कवर करेगी।


मैंने सवाल को एक साधारण मामले में संकरा करने के लिए संपादित किया
जेक

1

एक पाठ्यपुस्तक उदाहरण शेल (कोड स्पष्टता के लिए) मानकर जो पहले से चल रही है (इसलिए डायनेमिक लिंकर किया जाता है), आपके द्वारा उल्लिखित कमांड को निम्नलिखित सिस्टम कॉल करने के लिए शेल की आवश्यकता होगी:

  • पढ़ें: इस मामले में अगली कमांड मिलती है gcc
  • कांटा: दो प्रक्रिया की आवश्यकता है, हम मानते हैं कि माता-पिता के पास 500 और बच्चे के लिए चित्रण है।
  • माता-पिता प्रतीक्षा (501) को बुलाएंगे, इस बीच बच्चा निष्पादन को बुलाएगा। इस बिंदु पर शेल अब पीआईडी ​​501 पर नहीं चल रहा है। जीसीसी न्यूनतम ओपन, क्लोज़, रीड, राइट, चामोद, फोर्क, एक्ज़ीक्यूट, वेट और एक्जिट सहित कई सिस्टम कॉल करता है।
  • जब जीसीसी कॉल से बाहर निकलता है, तो प्रतीक्षा वापस आ जाएगी, प्रॉम्प्ट को प्रदर्शित करने के लिए लिखने को कहा जाता है और प्रक्रिया दोहराएगी।

बेशक अधिक जटिल आदेश इस मूल अनुक्रम में अधिक जटिलता जोड़ते हैं। बुनियादी जटिलताओं के दो सरल उदाहरण बुनियादी io पुनर्निर्देशन हैं जहां कांटा और निष्पादन और पृष्ठभूमि प्रक्रियाओं के बीच एक खुला, करीब, डुबकी अनुक्रम डाला जाता है जहां प्रतीक्षा को छोड़ दिया जाता है (और एक और इंतजार सिगल्ड हैंडलर में जोड़ा जाता है)।


छोटा जोड़: लोडिंग और डायनेमिक लिंकिंग के बारे में सवाल पूछता है। सभी कोड जो स्टेटिक रूप से जुड़े हुए हैं, यानी वास्तव में प्रोग्राम फ़ाइल में शामिल हैं, प्रोग्राम शुरू होने से पहले कर्नेल द्वारा किया जाता है। डायनामिक रूप से भरी हुई लाइब्रेरी यानी अलग-अलग फाइलें, मुख्य () शुरू करने से पहले प्रोग्राम द्वारा ही हैंडल की जाती हैं। इसके लिए कोड स्वचालित रूप से gcc द्वारा जोड़ा जाता है।
स्टिग हेमर

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.