2015-02-21 7 views
27

मैंने पुस्तकों और ऑनलाइन संसाधनों में पढ़ा है कि कांटा() सिस्टम कॉल वर्तमान प्रक्रिया की एक प्रति बनाता है और दोनों प्रक्रियाएं फोर्क के बाद बिंदु से निष्पादित करना शुरू करती हैं() सिस्टम कॉल किया जाता है। क्या यह सही है?इस कोड में लिनक्स पर फोर्क() सिस्टम कॉल का व्यवहार

यदि यह सही है तो नीचे दिए गए कोड "टेस्ट टेस्ट" क्यों प्रिंट करते हैं? इसे सिर्फ एक बार "टेस्ट" प्रिंट करना चाहिए (मूल प्रक्रिया द्वारा)।

#include <sys/types.h> /* pid_t */ 
#include <sys/wait.h> /* waitpid */ 
#include <stdio.h>  /* printf, perror */ 
#include <stdlib.h> /* exit */ 
#include <unistd.h> /* _exit, fork */ 


int main(void) 
{ 
    int ctr =1; 
    int pc = 1; 
    printf("%s", "Test "); 
    pid_t pidmain = fork(); 
    return EXIT_SUCCESS; 
} 
+12

"परीक्षण" स्ट्रिंग में "\ n" जोड़ें। – wildplasser

+0

@ विल्डप्लेसर आश्चर्यजनक रूप से जोड़ने के बाद \ n मुझे टेस्ट (सिंगल टाइम) 2 गुना नहीं मिला। लेकिन क्यों? –

+16

स्टडआउट की रेखा बफरिंग। आपके कार्यक्रम की कांटा() डी प्रतियां दोनों में स्टडआउट पर अर्ध-भरे बफर होते हैं, जो कार्यक्रम से बाहर निकलते हैं। (दोनों बाहर निकलें)। इसे प्रदर्शित करने के लिए, आप फोर्क() – wildplasser

उत्तर

37

जब आप fork() फोन ऑपरेटिंग सिस्टम वर्तमान प्रक्रियाओं पूरे स्मृति की एक प्रति (यह वास्तव में स्मृति नकल नहीं करता है के बाद से यह इस कुशलता से करने के लिए उपयोग कर सकते हैं MMU) पैदा करता है।

चूंकि stdout डिफ़ॉल्ट रूप से buffered है, यह केवल एक बार नए अक्षरों को लिखा जाने के बाद संदेश मुद्रित करेगा या स्ट्रीम फ़्लश हो जाएगी। जब आप एक नई प्रक्रिया काटते हैं तो वर्तमान लिखने वाले बफर ("टेस्ट" युक्त) को भी नई प्रक्रिया में डुप्लिकेट किया जाएगा। प्रक्रिया के बाहर निकलने के बाद यह मुद्रित किया जाएगा क्योंकि यह निश्चित रूप से बंद हो जाता है (और फ्लश) stdout। यदि आप को printf("%s\n", "Test "); के साथ प्रतिस्थापित करते हैं या fork() से पहले fflush(stdout); कॉल जोड़ें तो आपको अपेक्षित आउटपुट दिखाई देगा।

+6

या यदि सी लाइब्रेरी का निर्णय है कि बफर में बहुत अधिक होना शुरू हो रहा है ... बफर में शेष उत्पादन पर निर्भर होना और फोर्क कॉल के दौरान कॉपी किया जाना गलत होगा। उपयोगी लिंक इंगित करने के लिए –

18

उस बिंदु पर जहां आप कांटा कहते हैं, दोनों प्रक्रियाओं में मानक आउटपुट के लिए उनके बफर में स्ट्रिंग "टेस्ट" होता है। जब प्रत्येक प्रक्रिया निकलती है, तो वे दोनों इस पाठ को आउटपुट में फ्लश करते हैं (स्पष्टीकरण के लिए exit देखें)। आप बफर में एक नई लाइन जोड़ सकते हैं (जैसा कि सुझाव दिया गया है) (और यह बफरिंग के कारण बाहर आ जाएगा - स्पष्टीकरण के लिए setbuf देखें)। या आप कांटा से पहले fflush (stdout) को कॉल कर सकते हैं और "टेस्ट" स्ट्रिंग के लिए जो भी आपने पूछा है उसे ठीक से प्राप्त करें।

+0

धन्यवाद। –

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