Gibt es in Linux/Unix „nicht standardmäßige“ Streams?

Gibt es in Linux/Unix „nicht standardmäßige“ Streams?

Die sogenannten „Standard-Streams“ in Linux sind stdin, stdout und stderr. Sie müssen aus gutem Grund „Standard“ genannt werden. Gibt es nicht standardmäßige Streams? Werden diese nicht standardmäßigen Streams vom Kernel grundsätzlich anders behandelt?

Antwort1

In diesem Kontext ist ein „Stream“ eine geöffnete Datei in einem Prozess. (Das Wort „Stream“ kann andere Bedeutungen haben, die hier nicht zum Thema gehören.)

Die drei Standard-Streams sind diejenigen, die bereits geöffnet sein sollten, wenn ein Programm startet. Dateideskriptor 0 wird Standardeingabe genannt, weil dort ein Programm Benutzereingaben oder seine Standarddateneingabe lesen soll. Dateideskriptor 1 wird Standardausgabe genannt, weil dort ein Programm seine normale Datenausgabe schreiben soll. Dateideskriptor 2 wird Standardfehler genannt, weil dort ein Programm seine Fehlermeldungen schreiben soll.

Andere Dateideskriptornummern sind nichts Standardmäßiges, da ihnen keine solche vordefinierte Rolle zugewiesen ist. Sie werden letztendlich für alles verwendet, was das Programm will. Man könnte also jede von einem Programm geöffnete Datei als „nicht standardmäßigen Stream“ bezeichnen, aber das wäre seltsam und verwirrend: „Datei öffnen, die nicht mit stdin, stdout oder stderr geöffnet wurde“ braucht eigentlich keinen Namen, und „nicht standardmäßiger Stream“ klingt, als wäre es ein spezieller Dateityp oder eine Datei, die mit einer nicht standardmäßigen Methode geöffnet wurde, was aber nicht der Fall ist.

Die herkömmliche Rolle der Dateideskriptoren 0–2 wird von der Standardbibliothek und bestimmten Programmen zugewiesen. Beispielsweise starten Konsolen-Anmeldeprogramme und Terminalemulatoren die Shell (oder ein anderes Programm) mit geöffnetem Terminal auf diesen Dateideskriptoren. Die C-Standardbibliothek erstellt FILE*Objekte (was C Streams nennt) für diese drei Standarddeskriptoren. Im Kernel gibt es keine spezielle Behandlung.

Antwort2

Der Kernel behandelt alle Dateideskriptoren auf die gleiche Weise. Es ist lediglich eine Konvention, Prozesse zu haben, die Dateideskriptor 0 als Eingabe (stdin), Dateideskriptor 1 als Ausgabe (stdout) verwenden und Fehler bei Dateideskriptor 2 (stderr) ausgeben.

Beim Start Ihres Terminals wird ein Pseudo-TTY erstellt und eine Shell mit den Dateideskriptoren 0, 1 und 2 zugewiesenen Ein-/Ausgaben gestartet. Wenn Ihr Programm diese Konvention dann nicht verwendet, müssen Sie die Ein- und/oder Ausgaben entsprechend umleiten.

verwandte Informationen