2010-02-05 7 views
6

मुझे पता है कि फोर्क() उच्च स्तर पर क्या करता है।फोर्क सिस्टम कॉल के बाद निचले स्तर पर क्या होता है?

  1. जैसे ही एक कांटा कॉल वहाँ है, एक जाल अनुदेश अनुसरण करता है और नियंत्रण कांटा "हैंडलर" निष्पादित करने के लिए कूदता है - क्या मैं जानना चाहते हैं यह है। अब, यह हैंडलर, जो कि एक और पता स्थान और प्रक्रिया नियंत्रण ब्लॉक बनाकर मूल प्रक्रिया को डुप्लिकेट करके, बाल प्रक्रिया बनाता है, प्रत्येक प्रक्रिया में 2 मान लौटाता है?

  2. फोर्क वापसी 2 मूल्यों के निष्पादन के किस बिंदु पर निष्पादन करता है?

इसे छोटा करने के लिए, क्या कोई व्यक्ति एक फोर्क कॉल के बाद निम्न स्तर पर होने वाली चरण-दर-चरण घटनाओं को समझा सकता है?

उत्तर

1

यह इतना कठिन नहीं है - फोर्क() syscall का कर्नेल आधा प्रक्रिया प्रक्रिया ब्लॉक के माध्यम से दो प्रक्रियाओं के बीच अंतर बता सकता है जैसा कि आपने उल्लेख किया है, लेकिन आपको ऐसा करने की भी आवश्यकता नहीं है। तो स्यूडोकोड लगता है:

int fork() 
{ 
    int orig_pid = getpid(); 

    int new_pid = kernel_do_fork();  // Now there's two processes 

    // Remember, orig_pid is the same in both procs 
    if (orig_pid == getpid()) { 
     return new_pid; 
    } 

    // Must be the child 
    return 0; 
} 

संपादित करें: अनुभवहीन संस्करण बस के रूप में आप का वर्णन करता है - यह एक नई प्रक्रिया संदर्भ बनाता है, प्रतियां जुड़े धागा संदर्भों के सभी, प्रतियां पृष्ठों और फ़ाइल मैपिंग के सभी , और नई प्रक्रिया को "चलाने के लिए तैयार" सूची में रखा गया है।

मुझे लगता है कि हिस्सा आप पर भ्रमित हो रहे हैं, यह है कि जब इन प्रक्रियाओं को फिर से शुरू (यानी जब kernel_do_fork से माता-पिता रिटर्न, और बच्चे पहली बार के लिए निर्धारित है), इसके बारे में बीच में शुरू होता है फ़ंक्शन (यानी पहले 'if' निष्पादित करना)। यह सटीक प्रतिलिपि है - दोनों प्रक्रियाएं फ़ंक्शन के दूसरे भाग को निष्पादित करेंगी।

+0

क्या आप मुझे बता सकते हैं कि kernel_do_fork() क्या है? क्या यह खुद को बार-बार नहीं बुला रहा है? –

+0

पॉल को समझाने के लिए अपना समय लेने के लिए धन्यवाद। –

1

प्रत्येक प्रक्रिया में लौटाया गया मूल्य अलग है। अभिभावक/मूल धागा बच्चे की प्रक्रिया का पीआईडी ​​प्राप्त होता है और बच्चे की प्रक्रिया 0 होती है।

लिनक्स कर्नेल इसे ईएक्स रजिस्टर में मान बदलकर x86 पर प्राप्त करता है क्योंकि यह copies the current thread मूल प्रक्रिया में है।

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