2009-05-29 12 views
9

ऐसा कहा जाता है कि fork सिस्टम कॉल कॉलिंग प्रक्रिया का एक क्लोन बनाता है, और फिर (आमतौर पर) बाल प्रक्रिया execve सिस्टम कॉल को अपनी छवि बदलने और नई प्रक्रिया चलाने के लिए जारी करती है। यह दो कदम क्यों?फोर्क के बारे में और सिस्टम कॉल निष्पादित करें

बीटीडब्ल्यू, execve क्या खड़ा है?

उत्तर

8

प्रत्येक चरण अपेक्षाकृत सरल है।

यूनिक्स में, आपकी प्रक्रिया में दो भाग हैं - एप्लिकेशन कोड ("टेक्स्ट") और रीड-राइट मेमोरी एरिया ("डेटा") के साथ केवल पढ़ने योग्य स्मृति क्षेत्र।

एक कांटा केवल पाठ पृष्ठ को छोड़कर, पढ़ने-लिखने वाले क्षेत्र को क्लोन करता है। अब आपके पास एक ही कोड चलने वाली दो प्रक्रियाएं हैं। वे एक रजिस्टर मूल्य से भिन्न होते हैं - कांटा से वापसी मूल्य - जो माता-पिता को बच्चे से अलग करता है।

एक निष्पादन टेक्स्ट पेज को प्रतिस्थापित करता है, डेटा डेटा को अकेला छोड़ देता है। निष्पादन के कई रूप हैं, इस पर निर्भर करता है कि आप कितनी पर्यावरण जानकारी दे रहे हैं। वेरिएंट की एक अतिरिक्त सूची के लिए http://linux.die.net/man/3/exec देखें।

+0

वास्तव में, आप कांटा() के साथ कुछ भी गलत नहीं कर सकते हैं, क्योंकि इसमें कोई तर्क नहीं है। क्या यह कोई आसान हो सकता है? – 0x6adb015

+6

उम्म, निष्पादन पूरे मिमी को प्रतिस्थापित करता है, केवल "टेक्स्ट" नहीं ... देखें /usr/src/linux/fs/exec.c और /usr/src/linux/fs/binfmt_elf.c – ephemient

+1

आमतौर पर, कांटा नहीं होगा डेटा क्षेत्र को क्लोन करें, लेकिन इसे कॉपी-ऑन-लिखित (गाय) के रूप में चिह्नित करें। यदि माता-पिता या बच्चे ने डेटा बदलने की कोशिश की है, तो पृष्ठ को क्लोन कर दिया जाएगा और माता-पिता और बच्चे अलग-अलग पृष्ठों के साथ समाप्त हो जाएंगे। – camh

11
  • कार्यकारी: निष्पादित नई प्रक्रिया
  • वी: तर्क
  • ई की सरणी उपयोग: निर्दिष्ट करें साथ ही पर्यावरण

कार्यकारी के अन्य रूपों लाजिमी है:

int execl(const char *path, const char *arg, ...); 
int execlp(const char *file, const char *arg, ...); 
int execle(const char *path, const char *arg,..., char * const envp[]); 
int execv(const char *path, char *const argv[]); 
int execvp(const char *file, char *const argv[]); 
  • एल: फंक्शन
  • पर सूची तर्क
  • p: उपयोग $ पथ निष्पादन योग्य फ़ाइल का पता लगाने का
3

"कार्यकारी" कार्यों का परिवार एक नई प्रक्रिया छवि के साथ (जहां यह कहा जाता है) से मौजूदा प्रक्रिया छवि को बदल, इसलिए बुला छवि की जगह नई प्रक्रिया छवि। उदाहरण के लिए। यदि आप एक खोल (/ bin/sh या/bin/csh) से 'ls' कमांड चलाते हैं तो खोल एक नई प्रक्रिया के लिए कांटा जाएगा जो तब ls निष्पादित करेगा। एक बार जब ls कमांड निकलता है तो यह मूल प्रक्रिया पर नियंत्रण देता है, जो इस उदाहरण में खोल है।

यदि कोई कांटा कार्यक्षमता नहीं थी तो खोल को 'एलएस' प्रक्रिया द्वारा प्रतिस्थापित किया जाएगा, जो बाहर निकलने पर आपको एक अप्राप्य टर्मिनल के साथ छोड़ देगा क्योंकि स्मृति में खोल की छवि को डीएस को निष्पादित कॉल पर बदल दिया गया था।

'exec' परिवार में भिन्नता 0x6adb015 के उत्तर को देखने के लिए।

14

दो-चरण का कारण लचीलापन है। दो चरणों के बीच आप बाल प्रक्रिया के संदर्भ को संशोधित कर सकते हैं कि नए निष्पादित कार्यक्रम का उत्तराधिकारी होगा।

कुछ बातें आप बदलना चाहते हैं कर सकते हैं:

  • फ़ाइल वर्णनकर्ता
  • उपयोगकर्ता/समूह आईडी
  • प्रक्रिया समूह और सत्र आईडी
  • वर्तमान निर्देशिका
  • संसाधन सीमा
  • निर्धारण प्राथमिकता और संबंध
  • फ़ाइल निर्माण मुखौटा (Umask)

आप कांटा और कार्यकारी विभाजित नहीं किया है और बजाय एक ही अंडे की तरह सिस्टम कॉल किया था, यह इन प्रक्रिया के प्रत्येक के लिए तर्क ले करने की आवश्यकता होगी जिम्मेदार बताते हैं यदि आप उन्हें एक बच्चे में अलग ढंग से सेट करना चाहता था प्रक्रिया। उदाहरण के लिए, विंडोज एपीआई में CreateProcess के लिए तर्क सूची देखें।

कांटा/निष्पादन के साथ, आप नए कार्यक्रम को निष्पादित करने से पहले जो भी विरासत प्रक्रिया गुणों को आप बच्चे में रखना चाहते हैं उसे बदलते हैं।

फ़ाइल डिस्क्रिप्टर सेट अप करना बच्चे के प्रक्रिया संदर्भ में बदलने के लिए एक आम बातों में से एक है। यदि आप किसी प्रोग्राम के आउटपुट को कैप्चर करना चाहते हैं, तो आप आम तौर पर पाइप (2) सिस्टम कॉल के साथ माता-पिता में पाइप बनायेंगे, और फोर्क (2) आईएनजी के बाद, आप मूल प्रक्रिया में लिखने के अंत को बंद कर देंगे और बंद कर देंगे निष्पादित करने से पहले बच्चे की प्रक्रिया में अंत पढ़ें (2)। (आप फाइल डिस्क्रिप्टर 1 (stdout) होने के लिए पाइप के बच्चे के अंत को सेट करने के लिए डुप्लिकेट (2) का भी उपयोग करेंगे)। यह एक सिस्टम कॉल में असंभव या प्रतिबंधित होगा।

+0

+1। मैं सोच रहा था कि आपका क्या मतलब है "अगर आप चाहते हैं कि इन प्रक्रियाओं में से प्रत्येक के लिए तर्क लेना होगा तो आप उन्हें बाल प्रक्रिया में अलग-अलग सेट करना चाहते हैं।" – Tim

+0

क्या कुछ उदाहरण कोड है जो बदलने के लिए एनवी वर्र्स डब्ल्यू और डब्ल्यू/ओ को विभाजित करने के लिए फोर्क और निष्पादन को दिखाता है, यह दिखाने के लिए कि कौन सा अधिक लचीला है? – Tim

+0

@ टिम: एक उदाहरण के लिए http://msdn.microsoft.com/en-us/library/ms682425(v=vs.85).aspx देखें, और देखें कि उस फ़ंक्शन कॉल में तर्क सूची सूचीबद्ध सब कुछ शामिल नहीं करती है ऊपर। – camh

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