2012-01-14 16 views
5
void child(int pid){ 
    printf("Child PID:%d\n",pid); 
    exit(0);  
} 
void parent(int pid){ 
    printf("Parent PID:%d\n",pid); 
    exit(0); 
} 

void init(){ 
    printf("Init\n");//runs before the fork 
} 


int main(){ 

    init();//only runs for parent i.e. runs once 
    printf("pre fork()");// but this runs for both i.e. runs twice 
    //why??? 

    int pid = fork(); 

    if(pid == 0){ 
     child(pid); //run child process 
    }else{ 
     parent(pid);//run parent process 
    } 
    return 0; 
} 

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

Init 
pre fork()Parrent PID:4788 
pre fork()Child PID:0 

मैं एक यूनिक्स OS में कोई प्रक्रिया (मेरे मामले में उबंटू) है। मैं समझ नहीं पा रहा हूं कि यह कैसे काम करता है। मुझे पता है कि fork() फ़ंक्शन मेरे प्रोग्राम को दो प्रक्रियाओं में विभाजित करता है लेकिन कहां से? क्या यह एक नई प्रक्रिया बनाता है और पूरे मुख्य फ़ंक्शन को फिर से चलाता है, और यदि ऐसा है तो init() केवल एक बार और printf() दो बार क्यों चलाया गया?

printf("pre fork()"); दो बार दौड़ता है और init() केवल एक बार कार्य करता है?

उत्तर

22

कांटा तक केवल एक प्रक्रिया है। यही है, वह पथ केवल एक बार निष्पादित किया जाता है। कांटा के बाद 2 प्रक्रियाएं होती हैं ताकि सिस्टम प्रक्रिया के बाद कोड दोनों प्रक्रियाओं द्वारा निष्पादित किया जा सके। आप जो अनदेखा करते हैं वह यह है कि दोनों समाप्त हो जाते हैं और दोनों exit पर कॉल करेंगे।

अपने कोड में आप stdio पर फ्लश नहीं कर रहे हैं। तो दोनों प्रक्रियाएं ऐसा करती हैं (बाहर निकलें stdio buffers flushes) - यही कारण है कि आप उस आउटपुट को देख रहे हैं।

इस प्रयास करें:

printf("pre fork()\n"); 
        ^^ should flush stdout 

या हो सकता है

printf("pre fork()\n"); 
fflush(stdout); 
+0

बहुत बहुत शुक्रिया। वास्तव में सहायक: डी – boogie666

+0

वाह, यह बहुत सूक्ष्म है! मेरे द्वारा +1! –

+2

बस एक नई लाइन डालने से बफर को फ्लश नहीं करना चाहिए। एक नियमित फ़ाइल पर पुनर्निर्देशित stdout के साथ कोड चलाएं और आप बिल्कुल वही व्यवहार देखेंगे। stdout * नहीं * लाइन डिफ़ॉल्ट रूप से buffered है जब तक यह एक tty है। –

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