Temo che la tua comprensione sia completamente all'indietro. :)
Pensa a "standard in", "standard out" e "errore standard" dalla prospettiva del programma , non dalla prospettiva del kernel.
Quando un programma deve stampare output, normalmente stampa su "standard out". Un programma in genere stampa l'output allo standard out printf
, che stampa SOLO allo standard out.
Quando un programma deve stampare informazioni sull'errore (non necessariamente eccezioni, si tratta di un costrutto del linguaggio di programmazione, imposto a un livello molto più alto), normalmente stampa su "errore standard". Normalmente lo fa con fprintf
, che accetta un flusso di file da utilizzare durante la stampa. Il flusso di file può essere qualsiasi file aperto per la scrittura: standard out, errore standard o qualsiasi altro file che è stato aperto con fopen
ofdopen
.
"standard in" viene utilizzato quando il file deve leggere l'input, utilizzando fread
o fgets
, o getchar
.
Ognuno di questi file può essere facilmente reindirizzato dalla shell, in questo modo:
cat /etc/passwd > /tmp/out # redirect cat's standard out to /tmp/foo
cat /nonexistant 2> /tmp/err # redirect cat's standard error to /tmp/error
cat < /etc/passwd # redirect cat's standard input to /etc/passwd
Oppure, l'intera enchilada:
cat < /etc/passwd > /tmp/out 2> /tmp/err
Esistono due avvertenze importanti: in primo luogo, "standard in", "standard out" e "errore standard" sono solo una convenzione. Sono una convenzione molto forte , ma è solo un accordo che è molto bello poter eseguire programmi come questo:grep echo /etc/services | awk '{print $2;}' | sort
e avere gli output standard di ciascun programma agganciati all'input standard del prossimo programma in cantiere.
In secondo luogo, ho fornito le funzioni ISO C standard per lavorare con flussi di file ( FILE *
oggetti) - a livello di kernel, sono tutti i descrittori di file ( int
riferimenti alla tabella dei file) e operazioni di livello molto inferiore come read
e write
, che non fare il buffering felice delle funzioni ISO C. Ho pensato di mantenerlo semplice e utilizzare le funzioni più semplici, ma ho pensato lo stesso che dovresti conoscere le alternative. :)