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 fopenofdopen .
"standard in" viene utilizzato quando il file deve leggere l'input, utilizzando freado 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 ( intriferimenti alla tabella dei file) e operazioni di livello molto inferiore come reade 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. :)