Ich fürchte, Ihr Verständnis ist völlig rückständig. :) :)
Denken Sie aus der Sicht des Programms an "Standard In", "Standard Out" und "Standard Error" , nicht aus Sicht des Kernels.
Wenn ein Programm eine Ausgabe drucken muss, druckt es normalerweise nach "Standardausgang". Ein Programm druckt normalerweise die Ausgabe nach Standardausgabe mit printf
, wobei NUR nach Standardausgabe gedruckt wird.
Wenn ein Programm Fehlerinformationen drucken muss (nicht unbedingt Ausnahmen, dies ist ein Programmiersprachenkonstrukt, das auf einer viel höheren Ebene auferlegt wird), wird es normalerweise als "Standardfehler" gedruckt. Dies geschieht normalerweise mit fprintf
, wodurch ein Dateistream akzeptiert wird, der beim Drucken verwendet wird. Der Dateistream kann eine beliebige Datei sein, die zum Schreiben geöffnet wurde: Standardausgabe, Standardfehler oder eine andere Datei, die mit fopen
oder geöffnet wurde fdopen
.
"Standard in" wird verwendet, wenn die Datei Eingaben mit fread
oder fgets
oder lesen muss getchar
.
Jede dieser Dateien kann wie folgt einfach von der Shell umgeleitet werden :
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
Oder die ganze Enchilada:
cat < /etc/passwd > /tmp/out 2> /tmp/err
Es gibt zwei wichtige Einschränkungen: Erstens sind "Standard in", "Standard out" und "Standardfehler" nur eine Konvention. Sie sind eine sehr starke Konvention, aber es ist alles nur eine Vereinbarung, dass es sehr schön ist, Programme wie dieses ausführen zu können: grep echo /etc/services | awk '{print $2;}' | sort
und die Standardausgaben jedes Programms mit der Standardeingabe des nächsten Programms in der Pipeline zu verknüpfen.
Zweitens habe ich die Standard-ISO-C-Funktionen für die Arbeit mit Dateistreams ( FILE *
Objekten) angegeben. Auf Kernelebene sind dies alle Dateideskriptoren ( int
Verweise auf die Dateitabelle) und viele Operationen auf niedrigerer Ebene wie read
und write
, die dies nicht tun Machen Sie die glückliche Pufferung der ISO C-Funktionen. Ich dachte, es einfach zu halten und die einfacheren Funktionen zu verwenden, aber ich dachte trotzdem, Sie sollten die Alternativen kennen. :) :)