2011-12-14 11 views
12

मेरे पास एक बहुत ही बुनियादी सवाल है। मेरे प्रोफेसर की व्याख्यान स्लाइड में, एक उदाहरण है जो मुझे वास्तव में नहीं मिलता है।सी मानक I/O बनाम यूनिक्स I/O मूल बातें

वह लिखा है:

printf("u"); 
write(STDOUT_FILENO, "m", 1); 
printf("d\n"); 

... और उसने कहा बाहर इस कोड के रख दिया होगा:

कीचड़

मैं इसे नहीं मिलता है। तो अगर कोई समझता है कि ऐसा क्यों होता है, तो कृपया मुझे समझाएं। (। दूसरा अंतिम स्लाइड पेज में):

संदर्भ इस सवाल

http://lagoon.cs.umd.edu/216/Lectures/lect17.pdf 

उत्तर

20

write एक सिस्टम कॉल है - यह उपयोगकर्ता मोड (जहां आपके जैसे प्रोग्राम चलते हैं) और ऑपरेटिंग सिस्टम कर्नेल (जो बाइट्स को फ़ाइल में लिखे जाने पर डिस्क पर वास्तविक लेखन को संभालता है) के बीच इंटरफ़ेस द्वारा कार्यान्वित किया जाता है।

printf एक सी मानक लाइब्रेरी फ़ंक्शन है - इसे आपके उपयोगकर्ता मोड प्रोग्राम में लोड किए गए लाइब्रेरी कोड द्वारा कार्यान्वित किया जाता है।

सी मानक लाइब्रेरी आउटपुट फ़ंक्शन डिफ़ॉल्ट रूप से उनके आउटपुट को बफर करते हैं, अंत तक लाइन तक पहुंचने तक। जब बफर पूर्ण या नई लाइन के साथ समाप्त हो जाता है, तो यह पुस्तकालय कार्यान्वयन से write पर कॉल के माध्यम से फ़ाइल में लिखा जाता है।

इसलिए, printf के माध्यम से आउटपुट ऑपरेटिंग सिस्टम write पर तुरंत भेजा नहीं जाता है। आपके उदाहरण में, आप 'यू' अक्षर को बफर करते हैं, फिर तुरंत 'एम' अक्षर लिखें, फिर बफर में "डी \ n" संलग्न करें और मानक लाइब्रेरी कॉल write(STDOUT_FILENO, "ud\n");

+0

+1। – hari

+0

मुझे मिल गया, धन्यवाद! –

10

डिफ़ॉल्ट रूप से, stdout है लाइन बफ़र; यह तब तक आउटपुट तक नहीं पहुंचाया जाता जब तक कि यह एक न्यूलाइन चरित्र (या बफर भरने तक) का सामना न करे।

तो "u""d\n" प्राप्त होने तक बफर में बैठता है। लेकिन write इस बफर को छोड़ देता है।

+0

मैं नहीं कहूंगा कि "सबवर्ट्स" " कुछ भी। बफर बरकरार है और ठीक से काम कर रहा है। अधिक सटीक रूप से, लिखना एक सिस्टम कॉल है और printf एक लाइब्रेरी फ़ंक्शन है। –

+0

@ हेथ: "बाईपास", फिर! –

+2

stdout डिफ़ॉल्ट रूप से * नहीं * लाइन buffered है। * यदि * stdout एक tty से जुड़ा हुआ है, तो यह डिफ़ॉल्ट रूप से लाइन buffered है। अगर stdout एक नियमित फ़ाइल या पाइप (या वास्तव में tty के अलावा कुछ भी है) तो यह डिफ़ॉल्ट रूप से ब्लॉक buffered होगा। –