Und was wir uns als nächstes anschauen ist, wie wir mit POSIX-Miteln die Ausgabe von Programmen
in Dateien umleiten können.
Das Ziel ist, dass ein Programm, das StandardIn und StandardOut verwendet, tatsächlich nicht
etwa auf das Terminal schreibt, sondern aus einer Datei liest bzw. in eine Datei hineinschreibt.
Und wie dies funktioniert ist, indem die beiden darunter liegenden Deskriptoren für StandardOut
und StandardIn umgebogen werden, sodass sie auf eine Datei zeigen.
Das Mittel der Wahl ist an der Stelle der DUP-Systemaufruf.
Dazu schauen wir uns zunächst einmal an, wie wir überhaupt mit Deskriptoren arbeiten können
und wie man diese umbiegen kann.
Dafür fangen wir erst einmal mit dem DUP-Systemaufruf an.
Was DUP macht, ist, dass es den Datei-Deskriptor, den es als einziges Argument bekommt, dupliziert.
Und der Rückgabewert ist ein zweiter Deskriptor, der auf dieselbe Datei zeigt.
Nun kann der neu erzeugte Deskriptor genauso verwendet werden wie der erste.
Das heißt, es kann darauf gelesen und geschrieben werden.
Der Zahlenwert, der den Deskriptor repräsentiert, wird dabei vom Betriebssystem gewählt.
Und im Vergleich dazu schauen wir uns nun den DUP-2-Aufruf an.
Denn mit DUP-2 können wir nun selbst bestimmen, welchen Wert der neue Deskriptor haben soll.
DUP-2 erwartet dementsprechend zwei Argumente.
Das erste Argument ist der Deskriptor, der dupliziert werden soll.
Und das zweite Argument ist ein Integer, dessen Zahlenwert als neuer Deskriptor genutzt werden soll.
Falls es sich bei dem zweiten Argument, hier dem New FD, um eine bereits geöffnete Datei handelt,
beziehungsweise um einen bereits gültigen Deskriptor, dann wird dieser erst geschlossen,
bevor die Nummer, die er innehat, wieder verwendet wird.
Damit können wir einen Datei-Deskriptor schaffen, der einen beliebigen Wert hat, den wir uns aussuchen können.
An der Stelle sollten wir im Hinterkopf behalten, dass die Standard-Eingabe immer der Deskriptor 0 ist
und die Standard-Ausgabe der Deskriptor 1 bzw. der Standard-Fehler-Ausgabe-Kanal der Deskriptor 2 ist.
Wenn wir nun also DUP-2 verwenden wollen, um den Standard-Ausgabe-Kanal umzuleiten,
dann müssen wir zunächst einmal einen Deskriptor schaffen, der auf etwas zeigt, wohin wir die Ausgabe umleiten möchten.
In diesem Beispiel verwenden wir einfach den Open-System-Aufruf auf die Datei slash def null
und dabei bestimmen wir, dass der Deskriptor schreiben soll.
Um nun die Standard-Ausgabe auf die Datei slash def null umzuleiten,
müssen wir erst einmal ermitteln, welchen Zahlenwert der Deskriptor für stdout hat.
Dies ist für gewöhnlich die 1.
Aber man kann auch mittels eines Makros, nämlich stdout, file.no darauf zugreifen.
Also rufen wir nun DUP-2 auf mit dem ersten Argument fd, welches der Deskriptor für slash def null ist
und das zweite Argument der Deskriptor für die Standard-Ausgabe.
Sobald dieser System-Aufruf erfolgreich war, zeigt nun die Standard-Ausgabe auf die Datei slash def null.
Wenn wir nun also die Standard-Ausgabe nutzen, z.B. indem wir ein Printf schreiben,
dann wird alles, was wir nun in Printf schreiben, in die Datei slash def null geschrieben.
An der Stelle ist ja noch angemerkt, dass es sich bei slash def null um eine spezielle Datei handelt,
denn sämtliche Ausgabe, die dahin geschieht, verpufft ins Nichts.
Wollen wir nun also die Ausgabe eines Programms, das wir starten wollen, in eine bestimmte Datei umleiten,
können wir dies tun.
Dies funktioniert, weil Datei-Deskriptoren sowohl bei Fork als auch beim Exec erhalten bleiben.
Und das Konzept von Datei-Deskriptoren und das Zusammenspiel mit Lese- und Schreiboperation auf Dateien
ein bisschen genauer zu illustrieren, haben wir hier ein kleines Beispiel vorbereitet.
In dem Beispiel soll gezeigt werden, wie wir auf der UserSpace Seite einmal den Datei-Deskriptor haben
und wie dies auf der Kernelseite verwendet wird.
In dem Beispiel haben wir eine UserSpace Anwendung, die einmal den Open-System-Aufruf auf der Datei
Datei.txt aufruft.
Zugänglich über
Offener Zugang
Dauer
00:14:13 Min
Aufnahmedatum
2020-12-01
Hochgeladen am
2020-12-01 16:29:37
Sprache
de-DE