2012-10-15 12 views
40

में stdout और STDOUT_FILENO के बीच अंतर मैं stdout और STDOUT_FILENO के बीच का अंतर सोच रहा था लिनक्स सीलिनक्स सी

में कुछ खोज काम के बाद, मैं निम्नलिखित निष्कर्ष निकालना। क्या आप मेरी समीक्षा करने और इसमें कोई गलती सुधारने में मेरी मदद कर सकते हैं? धन्यवाद

  • stdout सी भाषा की मानक I/O स्ट्रीम से संबंधित है; जिसका प्रकार FILE * है और stdio.h

  • STDOUT_FILENO, एक int प्रकार रखने के लिए परिभाषित किया गया है, unistd.h पर परिभाषित किया गया है। यह LINUX सिस्टम का एक फ़ाइल वर्णनकर्ता है। कुछ हद तक, एक प्रणाली API जैसे

The following symbolic constants shall be defined for file streams: 

STDERR_FILENO 
    File number of stderr; 2. 
STDIN_FILENO 
    File number of stdin; 0. 
STDOUT_FILENO 
    File number of stdout; 1. 

तो, मेरी राय में, STDOUT_FILENO अंतर्गत आता है सिस्टम स्तर बुला और,: unistd.h में, यह नीचे के रूप में विस्तार से बताया है। सिस्टम में किसी भी डिवाइस का वर्णन करने के लिए STDOUT_FILENO का उपयोग किया जा सकता है।

stdout उच्च स्तर (उपयोगकर्ता स्तर?) में रेखांकित करता है और वास्तव में STDOUT_FILENO के विवरण को समाहित करता है। stdout में आई/ओ बफर है।

यह उनके अंतर के बारे में मेरी समझ है। कोई टिप्पणी या सुधार की सराहना की है, धन्यवाद।

+0

प्रश्न क्या है? –

+0

@KerrekSB सवाल यह है कि मुझे यकीन नहीं है कि मेरी समझ सही है या नहीं? –

+0

'STDOUT_FILENO' * लिनक्स * विशिष्ट नहीं है। सभी POSIX (और यूनिक्स) सिस्टम में यह है (उदा। मैकोज़क्स या फ्रीबीएसडी या सोलारिस) –

उत्तर

57

stdout मानक आउटआउट स्ट्रीम देने वाला FILE* "निरंतर" है। तो स्पष्ट रूप से fprintf(stdout, "x=%d\n", x); का समान व्यवहार printf("x=%d\n", x); है; आप fprintf, fputs आदि जैसे stdout<stdio.h> के लिए कार्यों का उपयोग ..

STDOUT_FILENO एक पूर्णांक फ़ाइल की जानकारी देता है (वास्तव में, पूर्णांक 1)। आप इसे write syscall के लिए उपयोग कर सकते हैं।

दोनों के बीच संबंध STDOUT_FILENO == fileno(stdout)

है (सिवाय आप fclose(stdout); की तरह अजीब बातें करते हैं, या शायद कुछ fclose(stdin), जो आप करना लगभग कभी नहीं करना चाहिए के बाद कुछ freopen! देखें this, के रूप में J.F.Sebastian द्वारा टिप्पणी की बाद)

आप आमतौर पर FILE* चीजें पसंद करते हैं, क्योंकि वे buffered (इसलिए आमतौर पर अच्छा प्रदर्शन करते हैं)। कभी-कभी, आप बफर फ्लश करने के लिए fflush पर कॉल करना चाह सकते हैं।

आप write(2) तरह syscalls (जो stdio पुस्तकालय द्वारा प्रयोग किया जाता है), या poll(2) के लिए फ़ाइल वर्णनकर्ता नंबरों का उपयोग कर सकते हैं। लेकिन syscalls का उपयोग clumpsy है। यह आपको बहुत अच्छी दक्षता दे सकता है (लेकिन कोड करना मुश्किल है), लेकिन अक्सर stdio लाइब्रेरी पर्याप्त (और अधिक पोर्टेबल) पर्याप्त है।

(बेशक आप stdio काम करता है, और #include <unistd.h> -और write तरह syscalls के लिए कुछ अन्य headers-। और stdio कार्यों के लिए #include <stdio.h> syscalls के साथ लागू कर रहे हैं चाहिए, ताकि fprintfwrite कॉल कर सकते हैं)।

+12

'STDOUT_FILENO == fileno (stdout) 'आश्चर्यजनक, यह अभिव्यक्ति मुझे इस मुद्दे को पूरी तरह से समझने में मदद करती है। बहुत बहुत धन्यवाद। @ बेसिल –

+0

['STDOUT_FILENO == fileno (stdout)'] (http://stackoverflow.com/q/25516375/4279) - क्या यह हमेशा सच है? – jfs

+0

हमेशा नहीं, मैंने "अजीब चीज़ों" का उल्लेख किया .... –

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