2008-12-03 17 views
15

मैं सिर्फ कर्नीघान और रिची की पुस्तक के साथ सी सीख रहा हूं; मैं चौथे अध्याय (कार्य सामग्री) की मूल बातें में हूं। दूसरे दिन मैं sleep() समारोह के बारे में उत्सुक हो गया है, इसलिए इस तरह इसका इस्तेमाल करने की कोशिश की:printf() नींद से पहले कुछ भी प्रिंट क्यों नहीं करता है()?

#include <stdio.h> 
#include <unistd.h> 

int main(void) 
{ 
    printf(" I like cows."); 
    sleep(5); 
    return 0; 
} 

समस्या कार्यक्रम के उत्पादन में, ऐसा लगता है कि यह करता sleep() पहले और उसके बाद printf(), अन्य में है शब्द, यह पांच सेकंड इंतजार करता है और फिर स्ट्रिंग प्रिंट करता है। तो मैंने सोचा, शायद प्रोग्राम sleep() पर इतना तेज़ हो जाता है कि यह printf() को अपना काम पूरा करने की अनुमति नहीं देता है, जो स्ट्रिंग प्रिंट करता है और फिर सो जाता है।

मैं कैसे स्ट्रिंग दिखा सकते हैं और उसके बाद सोने के लिए कार्यक्रम रखा? कंपाइलर ओपनबीएसडी 4.3 में जीसीसी 3.3.5 (प्रोपोलिस) है।

पुनश्च मैं नहीं जानता कि कैसे आप यहाँ पूर्वप्रक्रमक लाइनों को सही ढंग से डाल दिया।

उत्तर

2

आपकी समस्या यह है कि printf (और stdout (मानक आउटपुट) को लिखने के लिए stdio लाइब्रेरी का उपयोग करने वाले किसी और चीज को बफर किया गया है - अगर यह कंसोल पर जाता है तो लाइन buffered किया जाता है, और आकार फ़ाइल में जाता है तो बफर किया जाता है। यदि आप printf के बाद fflush(stdout); करते हैं, तो यह वही करेगा जो आप चाहते हैं। आप अपनी स्ट्रिंग में केवल एक नई लाइन ('\ n') जोड़ने का प्रयास कर सकते हैं, और जब तक आप मानक आउटपुट को फ़ाइल में रीडायरेक्ट नहीं करते हैं तब तक यह सही काम करेगा।

मैं नहीं 100% यकीन है, लेकिन मुझे लगता stderr बफ़र नहीं है, जो भ्रम की स्थिति पैदा क्योंकि आप उत्पादन आप stderr उत्पादन इससे पहले कि आप पहले से stdout करने के लिए बनाया के लिए किए गए देख सकते हैं कर सकते हैं।

+0

printf बफ़र नहीं है कॉल के बजाय

printf(" I like cows.\n"); 

कोशिश कर सकते हैं , जिस धारा को वह लिख रहा है वह है। –

+0

stderr आमतौर पर unbuffered है (हालांकि यह लाइन buffered हो सकता है)। –

31

printf()stdout (डिफ़ॉल्ट आउटपुट स्ट्रीम) को लिखता है जो आम तौर पर लाइन buffered है। बफर को sleep द्वारा फ़्लश नहीं किया जाता है, इसलिए कुछ भी प्रदर्शित नहीं होता है, जब प्रोग्राम से बाहर निकलता है तो सभी धाराओं को स्वचालित रूप से फ़्लश किया जाता है, यही कारण है कि यह बाहर निकलने से ठीक पहले प्रिंट करता है। , के रूप में

int main(void) 
{ 
    printf(" I like cows."); 
    fflush(stdout); 
    sleep(5); 
    return 0; 
} 

आप एक धारा है कि बफ़र लाइन नहीं करने के लिए प्रिंट कर रहे हैं: एक नई पंक्ति मुद्रण आमतौर पर धारा प्लावित हो जाएंगी वैकल्पिक रूप से आप fflush समारोह इस्तेमाल कर सकते हैं,:

int main(void) 
{ 
    printf(" I like cows.\n"); 
    sleep(5); 
    return 0; 
} 

या यदि मामला stdout रीडायरेक्ट किया गया है या आप एक फ़ाइल में लिख रहे हैं, तो बस एक नई लाइन प्रिंट करना शायद काम नहीं करेगा। यदि आप तुरंत लिखे गए डेटा चाहते हैं तो ऐसे मामलों में आपको fflush का उपयोग करना चाहिए।

+0

आपके पास दूसरे उदाहरण में अतिरिक्त \ n है –

+0

स्ट्रिंग कार्यों में \ n जोड़ने का कारण यह है कि कंसोल पर printf लाइन buffered है।हालांकि, अगर आप इसे किसी फ़ाइल में रीडायरेक्ट करते हैं तो यह पर्याप्त नहीं हो सकता है क्योंकि यह एक अलग बफरिंग योजना का उपयोग करता है। –

+0

दिलचस्प सवाल यह है कि, आप कैसे बता सकते हैं कि कौन सा बफरिंग मोड आपके वर्तमान फ़ाइल सूचक का उपयोग कर रहा है? –

3

बफरिंग का अर्थ है कि सभी आउटपुट किसी स्थान (जिसे बफर कहा जाता है) में संग्रहीत किया जाता है और इसमें कुछ निश्चित डेटा मौजूद होने के बाद आउटपुट होता है। यह दक्षता कारणों से किया जाता है।

कुछ (सबसे?) कार्यान्वयन एक नई पंक्ति के बाद बफर स्पष्ट जब कंसोल के लिए लिख है, तो आप भी fflush करने के लिए()

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