के बीच का अंतर मैं Google पर इन चारों के बीच अंतर ढूंढ रहा था और मुझे उम्मीद थी कि इस पर बड़ी मात्रा में जानकारी होगी, लेकिन वास्तव में वहां चार कॉल के बीच कोई ठोस तुलना नहीं थी।फोर्क(), vfork(), exec() और क्लोन()
मैंने इन सिस्टम कॉल के बीच मतभेदों को देखने के लिए एक तरह की बुनियादी संरचना को संकलित करने की कोशिश करने के बारे में सेट किया है और यहां मुझे जो मिला है। क्या यह सारी जानकारी सही है/क्या मुझे कुछ भी महत्वपूर्ण याद आ रही है?
Fork
: कांटा कॉल मूल रूप से लगभग हर तरह से (नहीं सब कुछ खत्म हो गया नकल की जाती है, उदाहरण के लिए, कुछ कार्यान्वयन में संसाधन सीमा लेकिन यह विचार अधिक से अधिक निकट प्रतिलिपि बनाने के लिए है में वर्तमान प्रक्रिया का डुप्लिकेट, समान बनाता है)।
नई प्रक्रिया (बच्चे) को एक अलग प्रक्रिया आईडी (पीआईडी) मिलती है और पुरानी प्रक्रिया (पैरेंट) का पीआईडी उसके मूल पीआईडी (पीपीआईडी) के रूप में होता है। चूंकि दो प्रक्रियाएं अब एक ही कोड को चल रही हैं, वे बता सकते हैं कि फोर्क के रिटर्न कोड से कौन सा है - बच्चे को 0 मिल जाता है, माता-पिता को बच्चे का पीआईडी मिल जाता है। यह सब निश्चित रूप से, कांटा कॉल काम मानते हैं - यदि नहीं, कोई बच्चा नहीं बनाया गया है और माता-पिता को त्रुटि कोड मिल जाता है।
Vfork
: vfork और कांटा के बीच मूल अंतर यह है कि जब vfork() के साथ एक नई प्रक्रिया बनाई जाती है, तो मूल प्रक्रिया अस्थायी रूप से निलंबित कर दी जाती है, और बच्चे की प्रक्रिया माता-पिता की पता स्थान उधार ले सकती है। यह अजीब स्थिति तब तक जारी है जब तक कि बच्चे की प्रक्रिया या तो बाहर निकलती है, या कॉल निष्पादित(), जिस बिंदु पर माता-पिता प्रक्रिया जारी है।
इसका मतलब है कि एक vfork() की बाल प्रक्रिया को माता-पिता प्रक्रिया के अप्रत्याशित रूप से संशोधित चर से बचने के लिए सावधान रहना चाहिए। विशेष रूप से, बच्चे की प्रक्रिया vfork() कॉल वाले फ़ंक्शन से वापस नहीं आनी चाहिए, और इसे बाहर निकलने की आवश्यकता नहीं है() (अगर इसे बाहर निकलने की आवश्यकता है, तो इसे _exit() का उपयोग करना चाहिए; असल में, यह बच्चे के लिए भी सच है एक सामान्य कांटा())।
Exec :
निष्पादन कॉल मूल रूप से पूरी प्रक्रिया को एक नए कार्यक्रम के साथ बदलने का एक तरीका है। यह प्रोग्राम को वर्तमान प्रक्रिया स्थान में लोड करता है और इसे प्रवेश बिंदु से चलाता है। exec() फ़ंक्शन द्वारा इंगित निष्पादन योग्य के साथ वर्तमान प्रक्रिया को प्रतिस्थापित करता है। नियंत्रण तब तक मूल प्रोग्राम पर वापस नहीं आ जाता जब तक कोई निष्पादन() त्रुटि न हो।
Clone :
क्लोन, फोर्क के रूप में क्लोन, एक नई प्रक्रिया बनाता है। कांटा के विपरीत, ये कॉल बच्चे को प्रक्रिया निष्पादन संदर्भ के हिस्सों को कॉलिंग प्रक्रिया के साथ साझा करने की अनुमति देती हैं, जैसे स्मृति स्थान, फ़ाइल वर्णनकर्ताओं की तालिका, और सिग्नल हैंडलर की तालिका।
जब क्लोन के साथ बाल प्रक्रिया बनाई जाती है, तो यह फ़ंक्शन एप्लिकेशन fn (arg) निष्पादित करता है। (यह कांटा से अलग है, जहां मूल फोर्क कॉल के बिंदु से बच्चे में निष्पादन जारी रहता है।) एफएन तर्क एक समारोह के लिए एक सूचक है जिसे बाल निष्पादन की शुरुआत में बाल प्रक्रिया द्वारा बुलाया जाता है। तर्क तर्क एफएन समारोह में पारित किया जाता है।
जब एफएन (तर्क) फ़ंक्शन एप्लिकेशन लौटाता है, तो बच्चे की प्रक्रिया समाप्त हो जाती है। एफएन द्वारा लौटाया गया पूर्णांक बाल प्रक्रिया के लिए निकास कोड है। बच्चे की प्रक्रिया बाहर निकलने (2) या घातक सिग्नल प्राप्त करने के बाद स्पष्ट रूप से समाप्त हो सकती है।
सूचना मिल प्रपत्र:
- Differences between fork and exec
- http://www.allinterview.com/showanswers/59616.html
- http://www.unixguide.net/unix/programming/1.1.2.shtml
- http://linux.about.com/library/cmd/blcmdl2_clone.htm
समय देने के लिए इस पढ़ने के लिए के लिए धन्यवाद! :)
vfork को बाहर निकलने के लिए क्यों कॉल नहीं करना चाहिए()? या वापस नहीं? बाहर निकलें नहीं() बस _exit() का उपयोग करें? मैं भी समझने की कोशिश कर रहा हूं :) – LazerSharks
@Gnuey: क्योंकि यह संभावित रूप से है (यदि इसे 'फोर्क()' से अलग किया गया है, जो कि लिनक्स में है, और शायद सभी बीएसडी) अपने माता-पिता की पता स्थान उधार लेते हैं। 'Execve()' या '_exit()' को कॉल करने के अलावा, यह कुछ भी करता है, माता-पिता को गड़बड़ करने की एक बड़ी संभावना है। विशेष रूप से, 'बाहर निकलें()' कॉल 'atexit()' हैंडलर और अन्य "फ़ाइनलाइज़र", उदाहरण: यह stdio धाराओं को फ़्लश करता है। एक 'vfork() 'बच्चे से लौटने से संभावित रूप से (पहले की तरह ही चेतावनी) माता-पिता के ढेर को गड़बड़ कर देगी। – ninjalj
मैं सोच रहा था कि पैरेंट प्रक्रिया के धागे के साथ क्या होता है; क्या वे सभी क्लोन किए गए हैं या केवल थ्रेड जो 'कांटा' syscall कहते हैं? –