2013-02-27 370 views
27

सी में stdin और STDIN_FILENO के बीच व्यावहारिक अंतर क्या है?stdin और STDIN_FILENO के बीच क्या अंतर है?

+1

[विषय पर एक दिलचस्प चर्चा] (http://www.rtems.com/ml/rtems-users/2011/march/msg00101.html)। शायद आपको यह भी पूछना चाहिए कि 'fileno (stdin) '' STDIN_FILENO' से अलग क्यों है। – user7116

+0

@ user7116 आपका लिंक दुर्भाग्य से मृत है। –

+0

यह लिंक काम करता है http://www.rtems.org/ml/rtems-users/2011/march/thrd1.html#00101 – pixelbeat

उत्तर

27

इंटरफ़ेस। जैसा कि हर किसी ने कहा है, stdin मानक सी लाइब्रेरी द्वारा परिभाषित FILE * है। आप fread, fwrite, और fprintf जैसे कुछ उच्च स्तरीय इंटरफेस का उपयोग कर सकते हैं। दूसरी तरफ, STDIN_FILENO सिर्फ एक फाइल डिस्क्रिप्टर है (लगभग निश्चित रूप से 0)। यह read और write की पसंद के माध्यम से थोड़ा सा स्तर इंटरफ़ेस का उपयोग करता है।

+11

कोई भी जवाब उल्लेख नहीं करता है कि 'STDIN_FILENO'' 'में परिभाषित एक मैक्रो है। कम से कम एक POSIX अनुपालन प्रणाली के लिए, यह केवल "लगभग निश्चित रूप से 0 नहीं है "; इसे 0 के रूप में परिभाषित करने की आवश्यकता है। इसी प्रकार, 'एसटी DOUT_FILENO' 1 है और 'STDERR_FILENO' है 2. –

+0

@ किथ थॉम्पसन धन्यवाद, यह देख रहा था! – KGCybeX

12

stdin एक डिफ़ॉल्ट फ़ाइल में मानक के अलावा अन्य कोई से इनपुट प्राप्त करने के लिए इस्तेमाल किया सूचक है।

STDIN_FILENO डिफ़ॉल्ट मानक इनपुट फ़ाइल वर्णनकर्ता संख्या जो 0 है। यह सामान्य रूप से सामान्य उपयोग के लिए एक परिभाषित निर्देश है।

1

/usr/include/stdio.h से,

/* Standard streams. */ 
extern struct _IO_FILE *stdin;   /* Standard input stream. */ 
extern struct _IO_FILE *stdout;   /* Standard output stream. */ 
extern struct _IO_FILE *stderr;   /* Standard error output stream. */ 
/* C89/C99 say they're macros. Make them happy. */ 
#define stdin stdin 
#define stdout stdout 
#define stderr stderr 

से /usr/include/unistd.h

/* Standard file descriptors. */ 
#define STDIN_FILENO 0  /* Standard input. */ 
#define STDOUT_FILENO 1  /* Standard output. */ 
#define STDERR_FILENO 2  /* Standard error output. */ 

पूर्व, stdin (_IO_FILE/usr/include/libio.h में परिभाषित) एक संरचना डेटा है। STDIN_FILENO एक मैक्रो स्थिरांक है, जो कर्नेल द्वारा उपयोग किए जाने वाले फ़ाइल डिस्क्रिप्टर को इंगित करता है।

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

void 
stdin_VS_STDIN_FILENO(void) 
{ 
    printf("stdin->_flags = %hd\n", stdin->_flags); 
    printf("STDIN_FILENO : %d\n", STDIN_FILENO); 
} 

int 
main(void) 
{ 
    stdin_VS_STDIN_FILENO(); 
    return 0; 
}