Verwirrt von stdin, stdout und stderr?
Ich bin etwas verwirrt, mit dem Zweck, diese drei Dateien. Wenn mein Verständnis richtig ist, stdin
ist die Datei, in der ein Programm schreibt in seinen Anforderungen zum ausführen einer Aufgabe im Prozess, stdout
ist die Datei, in die der kernel schreibt seine Ausgabe, und der Prozess beantragt, greift auf die Informationen aus, und stderr
ist die Datei, in die alle Ausnahmen eingetragen sind. Beim öffnen dieser Dateien, um zu überprüfen, ob diese tatsächlich auftreten, habe ich nichts gefunden, was nahe zu legen scheinen, so!
Was würde ich wissen wollen, was ist genau ist der Zweck dieser Dateien, absolut verdummt Antwort mit sehr wenig tech-jargon!
InformationsquelleAutor der Frage Shouvik | 2010-08-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Standard-Eingabe - dies ist die Datei-handledass Ihr Prozess liest Informationen von Ihnen zu erhalten.
Standard-Ausgabe - Ihr Prozess schreibt normal Informationen zu dieser Datei-handle.
Standard-Fehler - Ihr Prozess schreibt Fehler-Informationen zu dieser Datei-handle.
Das ist ungefähr so verdummt werden-nach unten wie ich es machen kann 🙂
Natürlich, das ist vor allem Konvention. Es gibt nichts hindert Sie schreiben Ihre Fehler-Informationen auf standard-Ausgabe, wenn Sie es wünschen. Sie können auch in der Nähe der drei Datei-handles völlig und öffnen Sie Ihre eigenen Dateien für I/O.
Wenn ein Prozess gestartet wird, sollte es bereits diese Griffe öffnen und es kann nur Lesen und/oder schreiben Sie Ihnen.
Standardmäßig, sind Sie wahrscheinlich mit Ihrem Endgerät (z.B.
/dev/tty
) aber Oberteile ermöglichen Ihnen, die verbindungen zwischen diesen Griffe und bestimmte Dateien und/oder Geräte (oder auch pipelines, die zu anderen Prozessen), bevor ein Prozess gestartet wird (einige der Manipulationen möglich sind, sehr geschickt).Beispiel:
wird:
my_prog
.inputfile
als Ihren standard-input (Datei-handle, 0).errorfile
als Ihre standard-Fehler (Datei-handle, 2).grep
.my_prog
zu den standard-input vongrep
.Re Ihr Kommentar:
Es ist, weil Sie keine normalen Dateien. Während UNIX stellt alles als Datei in einem Datei-system irgendwo, das macht es nicht so auf dem niedrigsten Niveau. Die meisten Dateien, die in der
/dev
Hierarchie sind entweder Zeichen-oder block-devices effektiv einen Treiber. Sie haben nicht die Größe, aber Sie haben eine major-und minor device number.Wenn Sie Sie öffnen, sind Sie an das Gerät angeschlossen-Treiber anstatt einer physikalischen Datei und der Treiber ist smart genug, um zu wissen, dass separate Prozesse sollten separat behandelt werden.
Das gleiche gilt für die Linux -
/proc
Dateisystem. Das sind keine echten Dateien, nur streng kontrollierte gateways kernel Informationen.InformationsquelleAutor der Antwort paxdiablo
Wäre es richtiger zu sagen, dass
stdin
stdout
undstderr
sind "I/O streams" eherals Dateien. Wie Sie bemerkt haben, diese Personen Leben nicht im Dateisystem. Aber die
Unix-Philosophie, soweit ich/O anbelangt, so ist "alles ist eine Datei". In der Praxis
das bedeutet, dass Sie können verwenden die gleiche Bibliothek-Funktionen und-Schnittstellen (
printf
,scanf
,read
write
select
usw.) ohne sich Gedanken darüber, ob die I/O-streamangeschlossen ist eine Tastatur, eine Datei, ein socket, eine pipe oder eine andere I/O-Abstraktion.
Meisten Programme Lesen müssen, Eingabe, Ausgabe, und Protokoll-Fehler, so
stdin
stdout
und
stderr
sind für Sie vordefiniert, wie eine Vereinfachung der Programmierung. Dies ist nureine Konvention, und nicht vom Betriebssystem erzwungen.
InformationsquelleAutor der Antwort Jim Lewis
Fürchte ich, wird dein Verständnis ist ganz nach hinten. 🙂
Denke der "standard", "Norm" und "standard-Fehler" von der Programm Perspektive nicht aus den kernel-Perspektive.
Wenn ein Programm braucht, um print-Ausgabe, es in der Regel Drucke auf "standard out". Ein Programm in der Regel druckt die Ausgabe auf standard-out mit
printf
die Drucke NUR auf standard out.Wenn ein Programm braucht, zu drucken, Fehler-information (nicht unbedingt Ausnahmen, sind diejenigen, die eine Programmier-Sprache zu konstruieren, auferlegt auf einer viel höheren Ebene), ist es normalerweise Drucke auf "standard-Fehler". Es ist in der Regel so mit
fprintf
die akzeptiert, dass ein stream-Datei zum ausdrucken. Die stream-Datei werden konnte, eine Datei zum schreiben geöffnet werden: Norm -, standard-Fehler, oder jede andere Datei, die geöffnet wurde, mitfopen
oderfdopen
."standard" wird verwendet, wenn die Datei Lesen muss-Eingang, mit
fread
oderfgets
odergetchar
.Diese Dateien können leicht umgeleitet von der shell aus, wie diese:
Oder, die ganze enchilada:
Gibt es zwei wichtige Einschränkungen: Erstens, "standard", "Norm" und "standard-Fehler" sind nur eine Konvention. Sie sind ein sehr stark Konvention, aber es ist alles nur ein Abkommen, es ist sehr schön, in der Lage zu laufen Programme wie dieses:
grep echo /etc/services | awk '{print $2;}' | sort
und haben die standard-Ausgänge der einzelnen Programme angespannt in die Standardeingabe des nächsten Programms in der pipeline.Zweite, die ich gegeben habe, die standard-ISO-C-Funktionen für die Arbeit mit Datei-streams (
FILE *
Objekte) -- auf der kernel-Ebene, es ist alle Datei-Deskriptoren (int
Verweise auf die Datei-Tabelle) und viel niedriger-level-Operationen wieread
undwrite
die nicht tun, die glücklich Pufferung des ISO-C-Funktionen. Ich dachte mir, es einfach zu halten und verwenden einfacher Funktionen, aber ich dachte, dass alle die gleichen, die Sie kennen sollten alternativen. 🙂InformationsquelleAutor der Antwort sarnold
Als Ergänzung der oben genannten Antworten, hier ist eine Summe über Umleitungen:
InformationsquelleAutor der Antwort Leopold Gault
stdin
Liest die Eingabe über die Konsole (z.B. Tastatureingaben).
Verwendet in C mit scanf
stdout
Erzeugt eine Ausgabe auf der Konsole.
Verwendet in C mit printf
stderr
Produziert 'Fehler' die Ausgabe in der Konsole.
Verwendet in C mit fprintf
Umleitung
Quelle für stdin umgeleitet werden können. Zum Beispiel, anstatt zu kommen, von Tastatur-Eingaben, kann es kommen, aus einer Datei (
echo < file.txt
), oder ein anderes Programm (ps | grep <userid>
).Die Ziele für stdout, stderr, kann auch umgeleitet werden. Zum Beispiel stdout kann in eine Datei umgeleitet:
ls . > ls-output.txt
in diesem Fall die Ausgabe in die Datei geschriebenls-output.txt
. Stderr umgeleitet werden können mit2>
.InformationsquelleAutor der Antwort mikek3332002
Verwendung von ps -aux zeigt die aktuellen Prozesse, die aufgeführt sind in /proc/wie /proc/pid ()/, durch Aufruf von cat /proc/pid ()/fd/0 druckt er alles, was gefunden wird in den standard output, process, denke ich. So vielleicht,
/proc/pid ()/fd/0 - Standard-Ausgabe-Datei
/proc/pid ()/fd/1 - Standard-Input-Datei
/proc/pid ()/fd/2 - Standard-Fehler-Datei
beispielsweise
Aber nur gearbeitet, diese auch für /bin/bash andere Prozesse in der Regel hatte nichts in 0, aber hatte viele Fehler geschrieben in 2
InformationsquelleAutor der Antwort Sam
Ich glaube, die Leute sagen, stderr sollte nur verwendet werden, für die Fehlermeldungen irreführend ist. Es sollte auch verwendet werden, für die informativen Nachrichten, die gemeint sind, für die Benutzer der den Befehl ausführt und nicht für alle möglichen nachgeschalteten Verbraucher von den Daten (d.h., wenn Sie ausführen einer shell-pipe-Verkettung mehrere Befehle, die Sie nicht wollen, um informative Meldungen wie "erste Position 30 von 42424" erscheinen auf stdout, da Sie verwirren den Verbraucher, aber Sie könnten noch den gewünschten Benutzer, Sie zu sehen.
Sehen http://www.jstorimer.com/blogs/workingwithcode/7766119-when-to-use-stderr-instead-of-stdout für historische Begründung:
"Alle Programme platziert Diagnostik auf die standard-Ausgabe. Dieser hatte immer Probleme damit, wenn die Ausgabe umgeleitet wurde, in eine Datei, aber unerträglich wurde, wenn die Nachricht gesendet wurde, um eine ahnungslose Prozess. Dennoch, nicht bereit zu verletzen und die Einfachheit der standard-input standard-output-Modell, die Menschen vertragen diesen Zustand bis v6. Kurz darauf Dennis Ritchie den gordischen Knoten durch die Einführung der standard-error-Datei. Das war nicht genug. Mit pipelines Diagnostik kommen konnte, aus jedem der mehreren Programme gleichzeitig laufen. Diagnostik benötigt, um sich zu identifizieren."
InformationsquelleAutor der Antwort dee
stderr nicht tun, IO-Cache-buffering also, wenn unser Antrag ausdrucken müssen kritische Nachricht an info (einige Fehler ,Ausnahmen) auf die Konsole oder in eine Datei verwenden, wo es als Standardausgabe nutzen, zu drucken Allgemeine log-info, wie es mit IO-Cache-buffering gibt es eine chance, dass vor dem schreiben unsere Nachrichten-Datei-Anwendung möglicherweise schließen ,verlassen Debuggen komplexer
InformationsquelleAutor der Antwort geekanil
Für Sie maßgebliche Informationen über diese Dateien, Lesen Sie die man-Seiten, führen Sie den Befehl auf Ihrem terminal.
Aber für eine einfache Antwort, jede Datei ist für:
stdout für einen stream aus
stdin für einen Strom-Eingang
stderr für Druckfehler oder log-Meldungen.
Jedes unix-Programm hat jeder dieser Ströme.
InformationsquelleAutor der Antwort Margach Chris
Einer Datei mit zugehörigen Puffern genannt ist ein stream und deklariert einen Zeiger auf einen definierten Typ-DATEI. Die Funktion fopen() erstellt bestimmte deskriptive Daten für einen Strom und gibt zurück einen Zeiger zu benennen, die den Strom in alle weiteren Geschäfte. Normalerweise gibt es drei offene Bäche mit konstanter Zeiger deklariert in der header und in Verbindung mit der standard-Dateien öffnen.
Bei Programm-Start drei streams sind vordefiniert und müssen nicht explizit geöffnet: Standardeingabe (zum Lesen konventioneller Eingabe), die Standardausgabe (zum schreiben konventioneller Ausgabe) und Standardfehlerausgabe (zum schreiben Diagnose-Ausgang). Beim öffnen der standard-Fehler-stream ist nicht voll gepuffert; die standard-Eingabe und standard-Ausgabe-streams sind voll gepuffert, wenn, und nur wenn der stream bestimmt werden kann, nicht beziehen sich auf ein interaktives Gerät
https://www.mkssoftware.com/docs/man5/stdio.5.asp
InformationsquelleAutor der Antwort Bahruz Balabayov