2013-02-27 7 views
27

Qual è la differenza pratica, se esiste, tra stdin e STDIN_FILENO in C?Qual è la differenza tra stdin e STDIN_FILENO?

+1

[Una discussione interessante sull'argomento] (http://www.rtems.com/ml/rtems-users/2011/march/msg00101.html). Forse dovresti anche chiedere perché 'fileno (stdin)' differisce da 'STDIN_FILENO'. – user7116

+0

@ user7116 Purtroppo il tuo link è morto. –

+0

Questo link funziona http://www.rtems.org/ml/rtems-users/2011/march/thrd1.html#00101 – pixelbeat

risposta

27

L'interfaccia. Come tutti gli altri hanno detto, stdin è un FILE * come definito dalla libreria c standard. È possibile utilizzare alcune delle interfacce di livello superiore come fread, fwrite e fprintf. D'altra parte, STDIN_FILENO è solo un descrittore di file (quasi certamente 0). Questo utilizza una leggera interfaccia di livello inferiore attraverso i Mi piace di read e write.

+11

Nessuna delle risposte indica che 'STDIN_FILENO' è una macro definita in' '. Almeno per un sistema conforme a POSIX, non è solo" quasi certamente 0 "; è necessario definirlo come 0. Analogamente,' ST DOUT_FILENO' è 1 e 'STDERR_FILENO' è 2. –

+0

@KeithThompson grazie, cercava questo! – KGCybeX

12

stdin è un puntatore predefinito di file utilizzato per ottenere input da nientemeno che standard.

STDIN_FILENO è il numero di descrittore predefinito di serie di file di input che è 0. È essenzialmente una direttiva definita per uso generale.

1

Da /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 

Da /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. */ 

Ex, stdin (_IO_FILE definito /usr/include/libio.h) è una struttura di dati. STDIN_FILENO è una costante macro, che punta a un descrittore di file utilizzato dal kernel.

#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; 
} 
Problemi correlati