मैं Google पर इन चार के बीच अंतर ढूंढ रहा था और मुझे उम्मीद थी कि इस पर भारी मात्रा में जानकारी होगी, लेकिन वास्तव में चार कॉल के बीच कोई ठोस तुलना नहीं थी।
मैंने इन सिस्टम कॉल्स और यहां मुझे जो कुछ मिला, उसके बीच के अंतर पर एक तरह की बुनियादी नज़र रखने की कोशिश करने की कोशिश की। क्या यह सब जानकारी सही है / क्या मुझे कुछ महत्वपूर्ण याद आ रहा है?
Fork
: कांटा कॉल मूल रूप से वर्तमान प्रक्रिया की एक डुप्लिकेट बनाता है, लगभग हर तरह से समान है (उदाहरण के लिए सब कुछ कॉपी नहीं किया गया है, कुछ कार्यान्वयन में संसाधन सीमाएं लेकिन विचार यह है कि कॉपी को यथासंभव बंद करें)।
नई प्रक्रिया (चाइल्ड) को एक अलग प्रक्रिया आईडी (पीआईडी) मिलती है और इसमें पीआईडी (पीपीआईडी) के रूप में पुरानी प्रक्रिया (पेरेंट) की पीआईडी होती है। क्योंकि दो प्रक्रियाएं अब एक ही कोड के साथ चल रही हैं, वे बता सकते हैं कि कौन से कांटे के रिटर्न कोड से - बच्चे को 0 मिलता है, माता-पिता को बच्चे का पीआईडी मिलता है। यह सब, निश्चित रूप से, कांटा कॉल कार्यों को मानते हुए - यदि नहीं, तो कोई बच्चा पैदा नहीं होता है और माता-पिता को एक त्रुटि कोड मिलता है।
Vfork
: Vfork और fork के बीच मूल अंतर यह है कि जब vfork () के साथ एक नई प्रक्रिया बनाई जाती है, तो मूल प्रक्रिया अस्थायी रूप से निलंबित हो जाती है, और बच्चे की प्रक्रिया माता-पिता के पते की जगह उधार ले सकती है। यह अजीब स्थिति तब तक जारी रहती है जब तक कि बच्चे की प्रक्रिया या तो बाहर निकल जाती है, या कॉल निष्पादित (), जिस बिंदु पर मूल प्रक्रिया जारी रहती है।
इसका मतलब यह है कि मूल प्रक्रिया के अनपेक्षित रूप से संशोधित चर से बचने के लिए एक vfork () की बाल प्रक्रिया सावधान रहना चाहिए। विशेष रूप से, बच्चे की प्रक्रिया को vfork () कॉल वाले फ़ंक्शन से वापस नहीं लौटना चाहिए, और इसे बाहर निकलना नहीं चाहिए () (यदि इसे बाहर निकलने की आवश्यकता है, तो इसे _exit () का उपयोग करना चाहिए; वास्तव में, यह बच्चे के लिए भी सही है। एक सामान्य कांटा ())।
Exec :
निष्पादन कॉल मूल रूप से एक नई कार्यक्रम के साथ पूरी वर्तमान प्रक्रिया को बदलने का एक तरीका है। यह कार्यक्रम को वर्तमान प्रक्रिया स्थान में लोड करता है और इसे प्रवेश बिंदु से चलाता है। निष्पादन () फ़ंक्शन द्वारा इंगित निष्पादन योग्य के साथ वर्तमान प्रक्रिया को बदलता है। जब तक कोई निष्पादन () त्रुटि नहीं होती है, नियंत्रण मूल कार्यक्रम में कभी नहीं लौटता है।
Clone :
क्लोन, कांटा के रूप में, एक नई प्रक्रिया बनाता है। कांटा के विपरीत, ये कॉल बच्चे को अपने निष्पादन संदर्भ के कुछ हिस्सों को कॉलिंग प्रक्रिया, जैसे मेमोरी स्पेस, फ़ाइल डिस्क्रिप्टर की तालिका और सिग्नल हैंडलर की तालिका के साथ साझा करने की अनुमति देती हैं।
जब बच्चे की प्रक्रिया क्लोन के साथ बनाई जाती है, तो यह फ़ंक्शन एप्लिकेशन fn (arg) को निष्पादित करता है। (यह कांटा से भिन्न होता है, जहां मूल कांटा कॉल के बिंदु से बच्चे में निष्पादन जारी रहता है।) fn तर्क एक फ़ंक्शन के लिए एक संकेतक है जिसे उसके निष्पादन की शुरुआत में बच्चे की प्रक्रिया द्वारा बुलाया जाता है। Arg तर्क fn फ़ंक्शन को दिया जाता है।
जब fn (arg) फ़ंक्शन अनुप्रयोग देता है, तो चाइल्ड प्रक्रिया समाप्त हो जाती है। Fn द्वारा दिया गया पूर्णांक बाल प्रक्रिया के लिए निकास कोड है। बाहर निकलने (2) को कॉल करके या घातक संकेत प्राप्त करने के बाद बच्चे की प्रक्रिया भी स्पष्ट रूप से समाप्त हो सकती है।
जानकारी प्राप्त प्रपत्र:
- कांटा और निष्पादन के बीच अंतर
- 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
इसे पढ़ने का समय निकालने के लिए धन्यवाद ! :)
fork()
किया जाता है, जो कि यह लिनक्स में है, और शायद सभी BSDs) अपने माता-पिता के पते की जगह उधार लेते हैं। कुछ भी, जो कॉल करने के अलावा execve()
या _exit()
, माता-पिता को गड़बड़ करने की एक बड़ी क्षमता है। विशेष रूप से, exit()
कॉल atexit()
हैंडलर और अन्य "फाइनल", जैसे: यह stdio धाराओं को फ्लश करता है। एक vfork()
बच्चे से वापस आना संभवतः (पहले की तरह ही कैवियट) माता-पिता के ढेर को गड़बड़ कर देगा।
fork
सिस्कॉल कहता है ?