2012-10-15 17 views
40

Mi chiedevo la differenza tra stdout e STDOUT_FILENO in Linux C.La differenza tra stdout e STDOUT_FILENO in LINUX C

Dopo un po 'di lavoro di ricerca, ho trarre la seguente conclusione. Potresti aiutarmi a rivederlo e correggere eventuali errori in esso? Grazie

  • stdout appartiene al flusso I/O standard del linguaggio C; il cui tipo è FILE * e definito in stdio.h

  • STDOUT_FILENO, in possesso di un tipo int, è definito in unistd.h. È un descrittore di file del sistema LINUX. In unistd.h, è spiegata come di seguito:

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. 

Quindi, a mio parere, il STDOUT_FILENO appartiene a livello di sistema di chiamata e, in una certa misura, come un sistema di API. STDOUT_FILENO può essere utilizzato per descrivere qualsiasi dispositivo nel sistema.

Il stdout individua in un livello superiore (livello utente?) E in realtà racchiude i dettagli di STDOUT_FILENO. stdout dispone di un buffer I/O.

Questa è la mia comprensione della loro differenza. Ogni commento o correzione è apprezzato, grazie.

+0

Qual è la domanda? –

+0

@KerrekSB La domanda è: non sono sicuro se la mia comprensione sia corretta? –

+0

'STDOUT_FILENO' non è * Linux * specifico. Tutti i sistemi POSIX (e Unix) ce l'hanno (ad esempio anche MacOSX o FreeBSD o Solaris) –

risposta

57

stdout è un valore "costante" FILE* che fornisce il flusso di uscita standard. Quindi, ovviamente, fprintf(stdout, "x=%d\n", x); ha lo stesso comportamento di printf("x=%d\n", x);; si utilizza per stdout<stdio.h> funzioni come fprintf, fputs ecc ..

STDOUT_FILENO è un descrittore di file intero (in realtà, l'intero 1). Potresti usarlo per syscall write.

La relazione tra i due è STDOUT_FILENO == fileno(stdout)

(tranne dopo aver fatto cose strane come fclose(stdout);, o forse qualche freopen dopo qualche fclose(stdin), che si dovrebbe quasi mai fare! See this, come commentato da J.F.Sebastian)

Di solito preferisci le cose FILE* perché sono bufferizzate (quindi in genere funzionano bene). A volte, è possibile chiamare fflush per svuotare i buffer.

è possibile utilizzare i numeri descrittore di file per syscalls come write(2) (che viene utilizzato dalla libreria stdio), o poll(2). Ma usare i syscalls è un po 'complesso. Può darti un'ottima efficienza (ma è difficile da codificare), ma molto spesso la libreria stdio è abbastanza buona (e più portatile).

(Ovviamente si deve #include <stdio.h> per le funzioni stdio e #include <unistd.h> -e qualche altro headers- per le chiamate di sistema come write. E le funzioni stdio sono implementate con chiamate di sistema, in modo da fprintf può chiamare write).

+12

'STDOUT_FILENO == fileno (stdout)' Meraviglioso, questa espressione mi aiuta a capire completamente questo problema. Molte grazie. @Basile –

+0

['STDOUT_FILENO == fileno (stdout)'] (http://stackoverflow.com/q/25516375/4279) - è sempre vero? – jfs

+0

Non sempre, ho citato "cose ​​strane" .... –

Problemi correlati