table of contents
- bookworm-backports 4.26.0-1~bpo12+1
- testing 4.26.0-1
- unstable 4.26.0-1
stdin(3) | Library Functions Manual | stdin(3) |
BEZEICHNUNG¶
stdin, stdout, stderr - Standard-E/A-Datenströme
BIBLIOTHEK¶
Standard-C-Bibliothek (libc, -lc)
ÜBERSICHT¶
#include <stdio.h>
extern FILE *stdin; extern FILE *stdout; extern FILE *stderr;
BESCHREIBUNG¶
Unter normalen Bedingungen werden beim Start jedes UNIX-Programms drei Datenströme geöffnet: Einen für die Eingabe, einen für die Ausgabe und einen zur Ausgabe von Diagnose- oder Fehlermeldungen. Diese werden typischerweise an das Terminal des Benutzers angehängt (siehe tty(4)), könnten sich stattdessen aber auch auf Dateien oder andere Geräte beziehen, abhängig von der Wahl des übergeordneten Prozesses. (Siehe auch den Abschnitt »Redirections« von sh(1).)
Der Eingabedatenstrom wird als »Standardeingabe«, der Ausgabedatenstrom als »Standardausgabe« und der Fehlerdatenstrom wird als »Standardfehler« referenziert. Die englische Form dieser Begriffe wird abgekürzt, um sich auf die Dateien zu beziehen, und zwar als stdin, stdout und stderr.
Jedes dieser Symbole ist ein stdio(3)-Makro des Typs Zeiger auf FILE und kann mit Funktionen wie fprintf(3) oder fread(3) verwandt werden.
Da FILEs ein puffernder Wrapper um UNIX-Dateideskriptoren sind, kann auf die gleichen zugrundeliegenden Dateien auch mittels der rohen UNIX-Dateischnittstelle zugegriffen werden, d.h. mittels Funktionen wie read(2) und lseek(2).
Beim Starten eines Programms sind die ganzzahligen, den Datenströmen stdin, stdout und stderr zugeordneten Dateideskriptoren 0, 1 bzw. 2. Die Präprozessorsysmbole STDIN_FILENO, STDOUT_FILENO und STDERR_FILENO sind mit diesen Werten in <unistd.h> definiert. (Durch freopen(3) auf einen dieser Datenströme kann die dem Datenstrom zugeordnete Dateideskriptornummer geändert werden.)
Beachten Sie, dass das Vermischen von FILEs und rohen Dateideskriptoren zu unerwarteten Ergebnissen führen kann und im Allgemeinen vermieden werden sollte. (Für die Masochisten: POSIX.1, Abschnitt 8.2.3 beschreibt im Detail, wie diese Wechselwirkung funktionieren soll.) Die allgemeine Regel lautet, dass Dateideskriptoren im Kernel gehandhabt werden, während Stdio nur eine Bibliothek ist. Das bedeutet beispielsweise, dass der Kindprozess nach einem exec(3) alle offenen Dateideskripten erbt, aber der Zugriff auf alle alten Datenströme nicht mehr möglich ist.
Da die Symbole stdin, stdout und stderr als Makros spezifiziert sind, ist eine Zuweisung an sie nicht portierbar. Die Standard-Datenströme können mit der Hilfe der Bibliotheksfunktion freopen(3) dazu gebracht werden, auf andere Dateien zu zeigen. Dies wurde insbesondere eingeführt, um die Zuweisung von stdin, stdout und stderr ändern zu können. Die Standarddatenströme werden durch einen Aufruf von exit(3) und bei der normalen Programmbeendigung geschlossen.
STANDARDS¶
C11, POSIX.1-2008.
Die Standards fordern auch, dass diese drei Datenströme beim Starten eines Programms geöffnet werden.
GESCHICHTE¶
C89, POSIX.1-2001.
ANMERKUNGEN¶
Der Datenstrom stderr ist nicht gepuffert. Der Datenstrom stdout ist zeilenweise gepuffert, wenn er auf ein Terminal zeigt. Unvollständige Zeilen werden nicht auftauchen, bis fflush(3) oder exit(3) aufgerufen werden oder ein Zeilenumbruch ausgegeben wird. Dies kann zu unerwarteten Ausgaben führen, insbesondere bei der Fehlersuche. Der Puffermodus der Standard-Datenströme (oder aller anderen Datenströme) kann mittels der Aufrufe setbuf(3) oder setvbuf(3) geändert werden. Beachten Sie, dass es auch Eingabepufferung im Terminal gibt (für den Fall, dass stdin einem Terminal zugeordnet ist), die vollkommen unabhängig von der Stdio-Pufferung ist. (Tatsächlich ist die normale Terminaleingabe zeilenweise im Kernel gepuffert.) Diese Kernel-Eingabehandhabung kann mit Aufrufen wie tcsetattr(3) geändert werden; siehe auch stty(1) und termios(3).
SIEHE AUCH¶
ÜBERSETZUNG¶
Die deutsche Übersetzung dieser Handbuchseite wurde von Helge Kreutzmann <debian@helgefjell.de> erstellt.
Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Übersetzer.
2. Mai 2024 | Linux man-pages 6.9.1 |