Monday, 15 June 2015

c - Printf before fork() is being printed twice -


इस सवाल का पहले से ही एक उत्तर है: < / P>

  • 3 जवाब

मैं एक बहु- कांका () का उपयोग करने वाली प्रक्रिया कार्यक्रम और मैं एक समस्या में टकराया

नीचे समस्या का पुन: प्रस्तुत करने वाला एक नमूना कोड है (त्रुटि जाँच के किसी भी प्रकार के बिना):

  #include & lt; stdio.h & gt; # शामिल करें & lt; unistd.h & gt; # शामिल करें & lt; sys / types.h & gt; Int main () {printf ("हैलो दुनिया"); कांटा(); }  

यह कोड 2 "हैलो वर्ल्ड" स्टेटमेंट प्रिंट करता है (माता-पिता से एक और दूसरे बच्चे से) हालांकि यह ऐसा नहीं होना चाहिए क्योंकि printf फ़ंक्शन कॉल फोर्क () सिस्टम कॉल से पहले है। परीक्षण के बाद, समस्या निम्न द्वारा सुलझायी जाती है:

  #include & lt; stdio.h & gt; # शामिल करें & lt; unistd.h & gt; # शामिल करें & lt; sys / types.h & gt; Int main () {printf ("हैलो वर्ल्ड \ n"); \\ नई लाइन के चरित्र के अलावा / या fflush (stdout) का उपयोग करके; कांटा(); }  

मेरा अनुमान यह है कि printf बफ़र को नकल नहीं किया जा रहा है, जबकि इसे फ्लेवर नहीं किया गया है, इसलिए बाल प्रक्रिया इस बफर को बाहर निकलने से पहले ही खाली कर रही है। इसलिए अन्य printf दिखाता है

क्या कोई इस मुद्दे के बेहतर स्पष्टीकरण प्रदान कर सकता है? या इससे भी बेहतर, मुझे सही करें यदि मैं ग़लत हूँ या कुछ भूल गया हूं। फ़ाइल संभाल stdout (जो printf <द्वारा प्रयोग किया जाता है

) डिफ़ॉल्ट रूप से लाइन बफ़र है, जिसका अर्थ है कि printf का उपयोग करके आउटपुट को फ़्लश किया जाएगा (और कंसोल में दिखाया गया है) या तो जब कोई न्यूलाइन होता है या बफर पूर्ण होता है ।

के रूप में कांका मूल प्रक्रिया की एक सटीक डुप्लिकेट बनाता है, दोनों प्रक्रियाओं (गैर फ्लश) आउटपुट बफ़र में एक ही सामग्री होती है, और जब दोनों प्रक्रियाओं से बाहर निकलता है।

तो हां, आप अपने अनुमान लगाने में सही हैं।


No comments:

Post a Comment