Standardströme
Im Computerprogrammierung, Standardströme sind miteinander verbundenen Ein- und Ausgangsausgaben Kommunikationskanäle[1] zwischen einem Computerprogramm und seiner Umgebung, wenn es mit der Ausführung beginnt. Die Drei Input-Output (E/O) Verbindungen werden genannt Standardeingabe (Stdin), Standardausgabe (Stdout) und Standart Fehler (Stderr). Ursprünglich ereignete sich I/O über eine körperlich verbundene körperlich verbundene Systemkonsole (Eingabe über Tastatur, Ausgabe über Monitor), aber Standardströme sind abstrahiert. Wenn ein Befehl über ein interaktives Befehl ausgeführt wird HülseDie Streams sind normalerweise mit dem verbunden Text Terminal auf der die Shell läuft, kann aber mit verändert werden mit Umleitung oder ein Pipeline. Allgemeiner a Kinderprozess erbt die Standardströme seiner Elternprozess.
Anwendung

Benutzer kennen im Allgemeinen Standard -Streams als Eingangs- und Ausgabekanäle, die Daten aus einem Eingabegerät verarbeiten oder Daten aus der Anwendung schreiben. Die Daten können Text mit jeder Codierung sein oder Binärdaten. In vielen modernen Systemen wird der Standardfehlerstrom eines Programms in eine Protokolldatei umgeleitet, typischerweise für Fehleranalysezwecke.
Streams können verwendet werden, um Anwendungen zu ketten, was bedeutet, dass der Ausgangsstrom eines Programms zum Eingangsstrom zu einer anderen Anwendung umgeleitet werden kann. In vielen Betriebssystemen wird dies durch Auflisten der Anwendungsnamen ausgedrückt, die durch den vertikalen Balkencharakter getrennt sind, aus diesem Grund, der oft als die genannt wird Pipeline Charakter. Ein bekanntes Beispiel ist die Verwendung von a Seitennummerierung Anwendung, wie z. mehrBereitstellung der Benutzersteuerung über die Anzeige des Ausgabestreams auf der Anzeige.
Hintergrund
In den meisten Betriebssystemen vor der Vorlage Unix, Programme mussten explizit eine Verbindung zu den entsprechenden Eingangs- und Ausgabegeräten herstellen. OS-spezifische Feinheiten führten dazu, dass dies eine mühsame Programmieraufgabe war. Auf vielen Systemen musste die Steuerung der Umgebungseinstellungen erhalten, auf eine lokale Dateitabelle zugreifen, den beabsichtigten Datensatz bestimmen und die Hardware im Fall von a korrekt verarbeiten Punch Card Reader, Magnetbandantrieb, Festplattenantrieb, Zeilendrucker, Kartenpunsch oder interaktives Terminal.
Einer der verschiedenen bahnbrechenden Fortschritte von Unix war Abstrakte Geräte, was die Notwendigkeit eines Programms beseitigte, um zu wissen oder darum zu kümmern, mit welchen Geräten es sich um die Kommunikation handelte. Ältere Betriebssysteme, die dem Programmierer eine Datensatzstruktur und häufig erzwingen Nicht-orthogonal Datensemantik und Gerätesteuerung. UNIX hat diese Komplexität mit dem Konzept eines Datenstroms beseitigt: eine geordnete Abfolge von Datenbytes, die gelesen werden können, bis die Ende der Datei. Ein Programm kann auch Bytes wie gewünscht schreiben und nicht benötigen, und kann ihre Zählung oder Gruppierung nicht leicht erklären.
Ein weiterer Unix-Durchbruch bestand darin, Eingaben und Ausgabe automatisch mit der Terminal-Tastatur bzw. der Terminalanzeige zu assoziieren-standardmäßig-das Programm (und der Programmierer) hat absolut nichts unternommen, um Eingaben und Ausgaben für ein typisches Eingangsprozess-Output-Programm festzulegen (es sei denn verschiedenes Paradigma). Im Gegensatz dazu erforderten frühere Betriebssysteme in der Regel einige - häufig - Komplex -Arbeitskontrollsprache Um Verbindungen herzustellen, oder die gleichwertige Belastung musste vom Programm orchestriert werden.
Da Unix Standardströme bereitstellte, die Unix C Die Laufzeitumgebung war verpflichtet, es ebenfalls zu unterstützen. Infolgedessen die meisten C -Laufzeitumgebungen (und Cs Nachkommen) Unabhängig vom Betriebssystem bieten eine äquivalente Funktionalität.
Standardeingang (STDIN)
Standardeingabe ist ein Stream, aus dem ein Programm seine Eingabedaten liest. Das Programm fordert Datenübertragungen mithilfe der lesen Betrieb. Nicht alle Programme erfordern Stream -Eingaben. Zum Beispiel die Dir und ls Programme (die in einem Verzeichnis enthaltene Dateinamen anzeigen) können dauern KommandozeilenargumenteFühren Sie aber ihre Vorgänge ohne Stream -Dateneingaben aus.
Wenn nicht umgeleitetDie Standardeingabe wird aus dem übergeordneten Prozess vererbt. Im Falle einer interaktiven Schale ist dies normalerweise mit dem verbunden Klaviatur.
Das Dateideskriptor Für die Standardeingabe ist 0 (Null); das Posix Stdin_fileno
; das entsprechende c Datei* stdin
; Ebenso das C ++ std :: cin
.
Standardausgabe (STDOut)
Standardausgabe ist ein Stream, auf den ein Programm seine Ausgabedaten schreibt. Das Programm fordert die Datenübertragung mit dem an schreiben Betrieb. Nicht alle Programme erzeugen Ausgabe. Zum Beispiel die Datei umbenennen Befehl (unterschiedlich genannt MV, Bewegung, oder Ren) schweigt über den Erfolg.
Wenn nicht umgeleitetDie Standardausgabe wird aus dem übergeordneten Prozess vererbt. Im Falle einer interaktiven Hülle ist das normalerweise das Text Terminal die das Programm initiierte.
Das Dateideskriptor Für die Standardausgabe ist 1 (eins); das Posix Stdout_fileno
; das entsprechende c Datei* stdout
; Ebenso das C ++ std :: Cout
.
Standardfehler (Stderr)
Standardfehler ist ein weiterer Ausgangsstrom, der normalerweise von Programmen zum Ausgang verwendet wird Fehlermeldungen oder Diagnostik. Es ist ein Stream unabhängig von der Standardausgabe und kann separat umgeleitet werden.
Dies löst die Semi-Predicate-Problem, sodass Ausgang und Fehler unterschieden werden können, und ist analog zu einer Funktion, die ein Wertepaar zurückgibt - siehe Semi-Predicate-Problem: Multi geschätzte Rendite. Das übliche Ziel ist das Text Terminal das begann das Programm, um die beste Chance zu bieten, auch wenn man gesehen wird, auch wenn Standardausgabe wird umgeleitet (also nicht leicht beobachtet). Zum Beispiel die Ausgabe eines Programms in a Pipeline wird umgeleitet, um das nächste Programm oder eine Textdatei einzugeben, aber Fehler aus jedem Programm gehen weiterhin direkt zum Textterminal, damit sie vom Benutzer in Echtzeit überprüft werden können.[2]
Es ist akzeptabel und normal zu leiten Standardausgabe und Standart Fehler an dasselbe Ziel, wie z. B. das Textterminal. Nachrichten erscheinen in derselben Reihenfolge wie das Programm, das sie schreibt, es sei denn Pufferung ist involviert. Beispielsweise ist der Standardfehlerstrom in gemeinsamen Situationen ausgeklappt, der Standardausgangsstrom ist jedoch leitend gepuffert. In diesem Fall kann ein Text, der später auf Standardfehler geschrieben wurde, früher am Terminal früher angezeigt, wenn der Standardausgabestream -Puffer noch nicht voll ist.
Das Dateideskriptor Für Standardfehler wird durch definiert durch Posix als 2 (zwei); das Stderr_fileno
;[3] das entsprechende c Datei* stderr
. Das c ++ std :: cerr
und std :: Clog
, der erstere wird nicht gelassen und letzteres mit dem gleichen Puffermechanismus wie alle anderen C ++ - Streams verwendet.
Bourne-Stil -Muscheln erlauben Standart Fehler zu demselben Ziel umgeleitet werden, wie die Standardausgabe verwendet wird, um sie zu verwenden
2> & 1
CSH-Stil -Muscheln erlauben Standart Fehler zu demselben Ziel umgeleitet werden, wie die Standardausgabe verwendet wird, um sie zu verwenden
> &
Der Standardfehler wurde in den 1970er Jahren zu UNIX hinzugefügt, nachdem mehrere verlorene Phototypes -Läufe mit Fehlermeldungen anstatt auf dem Terminal des Benutzers angezeigt wurden.[4]
Zeitleiste
1950er Jahre: Forran
Forran Hat das Äquivalent von UNIX -Dateideskriptoren: Nach Konvent Einheit = 5
für Stdin, Einheit = 6
für Stdout und Einheit = 0
Für Stderr. In Forran-2003 das Intrinsische ISO_FORTRAN_ENV
Das Modul wurde standardisiert, um die benannten Konstanten einzuschließen EINGABE EINHEIT
, AUSGABEEINHEIT
, und ERROR_UNIT
um die Einheitsnummern porttral anzugeben.
! FORTRAN 77 Beispiel PROGRAMM HAUPTSÄCHLICH GANZE ZAHL NUMMER LESEN(EINHEIT=5,*) NUMMER SCHREIBEN(EINHEIT=6,'(A, i3)' ') ' NUMMER IST: ',NUMMER ENDE
! FORTRAN 2003 Beispiel Programm hauptsächlich verwenden ISO_FORTRAN_ENV implizit keine ganze Zahl :: Nummer lesen (Einheit=EINGABE EINHEIT,*) Nummer schreiben (Einheit=AUSGABEEINHEIT,'(a, i3)' ') 'Nummer ist: ', Nummer Endprogramm
1960: Algol 60
Algol 60 wurde kritisiert, weil er keinen Standard -Dateizugriff hat.
1968: Algol 68
Algol 68Die Eingangs- und Ausgangsanlagen wurden gemeinsam als Bindung bezeichnet.[5] Koster koordinierte die Definition der Transport Standard. Das Modell enthielt drei Standardkanäle: drin stehen
, auffallen
, und treten Sie zurück
.
# ALGOL 68 BEISPIEL # MAIN :( Realnummer; getf (Stand in, ($ g $, Nummer)); printf (($ "Nummer lautet:" g (6,4) "oder" $, Nummer)); # Oder # putf (herausragend, ($ "Nummer lautet:" G (6,4) "! | |
Eingang: | Ausgabe: |
---|---|
3.14159 | Nummer lautet: +3.142 oder Nummer ist: +3.142! |
1970er Jahre: C und Unix
In dem C ProgrammierspracheDie Standardeingangs-, Ausgabe- und Fehlerströme werden an die vorhandenen UNIX -Dateideskriptoren 0, 1 bzw. 2 angehängt.[6] In einem Posix Umwelt die <Unistd.h> Definitionen Stdin_fileno, Stdout_fileno oder Stderr_fileno sollte stattdessen eher verwendet werden als Magische Zahlen. Dateizeiger Stdin, Stdout, und Stderr sind auch bereitgestellt.
Ken Thompson (Designer und Implementierer des ursprünglichen Unix -Betriebssystems) geändert Sortieren in Version 5 Unix zu akzeptieren "-" als Darstellung von Standardeingaben, die sich auf andere Dienstprogramme ausbreiteten und als Teil des Betriebssystems als a Sonderdatei in Version 8. Die Diagnostik war Teil der Standardausgabe durch Version 6, nachdem Dennis M. Ritchie Erstellt das Konzept des Standardfehlers.[7]
1995: Java
Im JavaDie Standardströme werden von bezeichnet von System.in
(für Stdin), System.out
(für stdout) und System.err
(für Stderr).[8]
Öffentlichkeit statisch Leere hauptsächlich(Saite Args[]) { Versuchen { BufferedReader Br = Neu BufferedReader(Neu InputStreamReader(System.in)); Saite s = Br.Zeile lesen(); doppelt Nummer = Doppelt.Parsedouble(s); System.aus.println("Nummer ist:" + Nummer); } Fang (Ausnahme e) { System.irren.println("Fehler:" + e.GetMessage()); } }
2000er: .NET
Im C# und andere .NETZ Sprachen, auf die Standardströme werden von bezeichnet durch System.console.in
(für Stdin), System.console.out
(für stdout) und System.console.Error
(für Stderr).[9] Grundlegende Lesen- und Schreibfunktionen für die Stdin- und Stdout -Streams sind auch direkt über die Klasse zugänglich System.Console
(z.B. System.Console.WriteLine ()
kann verwendet werden anstelle von System.console.out.WriteLine ())
).
System.console.in
, System.console.out
und System.console.Error
sind System.io.texTreader
(Stdin) und System.io.TextWriter
(STDOut, Stderr) Objekte, die nur den Zugriff auf die zugrunde liegenden Standardströme auf Textbasis ermöglichen. Voller binärer Zugriff auf die Standardströme muss über die durchgeführt werden System.io.stream
Objekte zurückgegeben von System.console.OpenAntandardInput ()
, System.console.OpenAntandardOutput ()
und System.console.OpenAntandardError ()
beziehungsweise.
// C# Beispiel Öffentlichkeit statisch int Hauptsächlich(Saite[] Args) { Versuchen { Saite s = System.Konsole.Im.Zeile lesen(); doppelt Nummer = doppelt.Analysieren(s); System.Konsole.aus.Schreiben("Nummer ist: {0: f3}", Nummer); Rückkehr 0; // Wenn Parse () eine Ausnahme gemacht hat } Fang (ArgumentNulLexception) { System.Konsole.Fehler.Schreiben("Es wurde keine Nummer eingegeben!"); } Fang (Formatexception) { System.Konsole.Fehler.Schreiben("Der angegebene Wert ist keine gültige Nummer!"); } Fang (Überlauf) { System.Konsole.Fehler.Schreiben("Die angegebene Zahl ist zu groß!"); } Rückkehr -1; }
'Visual Basic .net Beispiel Öffentlichkeit Funktion Hauptsächlich() Wie Ganze Zahl Versuchen Schwach s Wie Saite = System.Konsole.[Im].Zeile lesen() Schwach Nummer Wie Doppelt = Doppelt.Analysieren(s) System.Konsole.aus.Schreiben("Nummer ist: {0: f3}", Nummer) Zurückkehren 0 'Wenn Parse () eine Ausnahme gemacht hat Fang ex Wie System.ArgumentNulLexception System.Konsole.[Fehler].Schreiben("Es wurde keine Nummer eingegeben!") Fang EX2 Wie System.Formatexception System.Konsole.[Fehler].Schreiben("Der angegebene Wert ist keine gültige Nummer!") Fang ex3 Wie System.Überlauf System.Konsole.[Fehler].Schreiben("Die angegebene Zahl ist zu groß!") Ende Versuchen Zurückkehren -1 Ende Funktion
Beim Anwenden der System.Diagnostics.Process
Klasse Man kann die Instanz verwenden Eigenschaften Standardinput
, StandardOutput
, und Standart Fehler
dieser Klasse, um auf die Standardströme des Prozesses zuzugreifen.
2000 -: Python (2 oder 3)
Das folgende Beispiel zeigt, wie die Standardeingabe sowohl in die Standardausgabe als auch in eine Textdatei umleitet.
#!/usr/bin/env python importieren sys # Speichern Sie den aktuellen STDOut, damit wir sys.stdout zurückkehren können # Nachdem wir unsere Umleitung abgeschlossen haben stdin_fileno = sys.Stdin stdout_fileno = sys.Stdout # Sys.stdout in die Datei umleiten sys.Stdout = offen('myfile.txt', 'W') ctr = 0 zum INPS in stdin_fileno: CTRs = str(ctr) # Drucke zum umgeleiteten stdout () sys.Stdout.schreiben(CTRs + ") Dies ist für die umgeleiteten --->" + INPS + '\n') # Drucke zum tatsächlichen gespeicherten Stdout -Handler stdout_fileno.schreiben(CTRs + ") Dies ist für das tatsächliche --->" + INPS + '\n') ctr = ctr + 1 # Schließen Sie die Datei sys.Stdout.nah dran() # Sys.stdout in unserem alten gespeicherten Dateihandler wiederherstellen sys.Stdout = stdout_fileno
GUIS
Grafische Benutzeroberflächen (GUIS) Verwenden Sie nicht immer die Standardströme; Sie tun es, wenn GUIs Verpackungen von zugrunde liegenden Skripten und/oder Konsolenprogrammen sind, beispielsweise die Synaptisch Package Manager GUI, die APT -Befehle in Debian und/oder Ubuntu einräumt. GUIs erstellt mit Skriptwerkzeugen wie Zenity und Kdialog von Kde Projekt[10] Verwenden Sie Stdin, Stdout und Stderr und basieren eher auf einfachen Skripten als auf einer vollständigen GUI programmiert und kompiliert in C/C ++ Qt, Gtkoder ein anderes äquivalentes proprietäres Widget -Framework.
Das Dienstleistungsmenü, wie implementiert auf Nächster Schritt und Mac OS X, ist auch analog zu Standardströmen. Bei diesen Betriebssystemen können grafische Anwendungen über ein systemweites Menü Funktionalität liefern, das in der aktuellen Auswahl in der GUI unabhängig von der Anwendung arbeitet.
Einige GUI -Programme, hauptsächlich auf UNIX, schreiben immer noch Debug -Informationen in Standardfehler. Andere (wie viele Unix -Medienspieler) können Dateien aus Standardeingaben lesen. Beliebte Windows -Programme, die neben ihren GUI -Fenstern ein separates Konsolenfenster öffnen, sind die Emulatoren PSX und Dosbox.
Gtk-server kann Stdin als Kommunikationsschnittstelle mit einem interpretierten Programm verwenden, um eine GUI zu realisieren.
Das Common Lisp Interface Manager Paradigma "präsentiert" GUI -Elemente, die an einen erweiterten Ausgangsstrom gesendet wurden.
Siehe auch
- Umleitung (Computer)
- Stream (Computing)
- Input-Output
- C Dateieingabe/Ausgabe
- SYSIN und System
- Standardströme in OpenVMS
Verweise
- ^ D. M. Ritchie, "Ein Stream-Eingabe-Output-System", AT & T Bell Laboratories Technical Journal, 68 (8), Oktober 1984.
- ^ "Was sind Stdin, Stdout und Stderr in Linux? | Codepre.com". 2. Dezember 2021. Abgerufen 8. April 2022.
- ^ "<unistd.h>". Die offenen Gruppenbasisspezifikationen Ausgabe 6 - IEE STD 1003.1, 2004 Ausgabe. Die offene Gruppe. 2004.
- ^ Johnson, Steve (2013-12-11). "[TUHS] Grafische Systeme C/A/T PhototypesSetzer" (Mailingliste). Archiviert vom Original am 2020-09-25. Abgerufen 2020-11-07.
- ^ Überarbeiteter Bericht über das algorithmische Sprachalgol 68, herausgegeben von A. van Wijngaarden, B. J. Mailloux, J.E.L. Peck, C.H.A. Koster, M. Sintzoff, C.H. Lindsey, L.G.L.T. Meertens und R.G. Fisker, http://www.softwarePeservation.org/projects/algol/report/algol68_revised_report-ab.pdf, Abschnitt 10.3
- ^ "Stdin (3): Standard -E/A -Streams - Linux Man Page".
- ^ McIlroy, M. D. (1987). A Research Unix Reader: Annotierte Auszüge aus dem Programmierhandbuch, 1971–1986 (PDF) (Technischer Bericht). Cstr. Bell Labs. 139.
- ^ "System (Java -Plattform SE 7)". Abgerufen 20. Juli 2012.
- ^ "C# Referenzquelle, .NET Framework 4.7.1, Mscorlib, Konsolenklasse". referenzource.microsoft.com. Abgerufen 2017-12-10.
- ^ Kißling, Kristian (2009). "Hinzufügen von grafischen Elementen zu Ihren Skripten mit Zenity und Kdialog". Linux Magazine. Abgerufen 2021-04-11.
Quellen
- "Standardströme",", Die GNU C -Bibliothek
- Kronos 2.1 Referenzhandbuch, Control Data Corporation, Teilenummer 60407000, 1974
- NOS Version 1 Applications Programmer's Instant, Control Data Corporation, Teilenummer 60436000, 1978
- Stufe 68 Einführung in die Programmierung auf mehreren Mehrheitswesen, Honeywell Corporation, 1981
- Entwicklung des MVS -Betriebssystems, IBM Corporation, 1981
- Der Kommentar von Lions zu Unix Sechster Ausgabe, John Lions, ISBN1-57398-013-7, 1977
- Konsolenklasse, .NET Framework -Klassenbibliothek, Microsoft Corporation, 2008
Externe Links
- Standardeingangsdefinition - durch das Linux -Informationsprojekt
- Standardausgangsdefinition - durch das Linux -Informationsprojekt
- Standardfehlerdefinition - durch das Linux -Informationsprojekt