2013-02-27 16 views
27

Jaka jest praktyczna różnica, jeśli występuje, między stdin a STDIN_FILENO w C?Jaka jest różnica między stdin i STDIN_FILENO?

+1

[Ciekawa dyskusja na ten temat] (http://www.rtems.com/ml/rtems-users/2011/march/msg00101.html). Być może powinieneś także zapytać, dlaczego 'fileno (stdin)' różni się od 'STDIN_FILENO'. – user7116

+0

@ user7116 Twój link jest niestety martwy. –

+0

Ten link działa http://www.rtems.org/ml/rtems-users/2011/march/thrd1.html#00101 – pixelbeat

Odpowiedz

27

Interfejs. Tak jak wszyscy inni, stdin to FILE * zgodnie z definicją standardowej biblioteki c. Możesz używać niektórych interfejsów wyższego poziomu, takich jak fread, fwrite i fprintf. Z drugiej strony, STDIN_FILENO to tylko deskryptor pliku (prawie na pewno 0). Wykorzystuje to nieznacznie niższy poziom interfejsu, między innymi: read i write.

+11

Żadna z odpowiedzi nie wspomina, że ​​'STDIN_FILENO' jest makrem zdefiniowanym w' '. Przynajmniej dla systemu zgodnego z POSIX, to nie jest tylko" prawie na pewno 0 ", wymaga się zdefiniowania jako 0. Podobnie,' ST DOUT_FILENO' jest 1 i 'STDERR_FILENO' jest 2. –

+0

@KeithThompson dzięki, szukał tego! – KGCybeX

12

stdin jest wskaźnikiem domyślnego pliku, do którego dostać wejście od nikogo innego niż standardowy w.

STDIN_FILENO to domyślny standardowy plik wejściowy numer deskryptora który jest 0. Jest to zasadniczo zdefiniowana dyrektywa do ogólnego użytku.

1

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

Z /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 zdefiniowano w /usr/include/libio.h) jest dane struktury. STDIN_FILENO to stała makr, która wskazuje na deskryptor pliku używany przez jądro.

#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; 
} 
Powiązane problemy