Wenn Sie versuchen, die Programmausgabe mit der Syntax "Einige Zahlen größer als" (z. B. foo 2> myfile
) umzuleiten , welche Zahlen sind hier möglich und was stellen sie dar?
Ich glaube 1 ist /dev/stdout
, 2 ist /dev/stderr
. Was ist mit 5 & 6? Gibt es 3, 4 oder eine Zahl größer als 6?
io-redirection
file-descriptors
fifo
Fermats Schüler
quelle
quelle
Antworten:
Dieses angebliche Programm schreibt in die von Ihnen angegebene Dateideskriptornummer. Betrachten Sie das folgende Hallo-Welt-Programm:
kompiliere es
jetzt ein einfacher Lauf
Keine Datei für 5, also kein Byte geschrieben.
nächster Versuch:
Ich schaffe es, eine Ausgabe zu erhalten, während ich eine Datei und einen Dateideskriptor (z
5>u
. B. ) spezifiziere .In der Praxis ist es unwahrscheinlich, dass Sie Daten mit sammeln, es sei denn, Sie haben ein so lustiges Programm wie oben geschrieben
5>foo
.Im Shell-Skript sind Konstrukte mit <() nützlicher:
quelle
write()
kehrt zurückssize_t
, nichtint
.Die Zahlen stehen für Dateideskriptoren (Handles für geöffnete Dateien).
Die Shell hat normalerweise 3 automatisch eingestellt,
0 - stdin 1 - stdout 2 - stderr
Es können jedoch weitere Dateien geöffnet und die Zahlen erhöht werden.
quelle
Diese Nummern sind Dateideskriptoren . Wie Sie bereits bemerkt haben, gibt es mehrere, die automatisch erstellt werden. Wenn andere Dateien oder dateiähnliche Dinge geöffnet werden, erhalten sie andere Nummern.
Die Nummern, die in einem bestimmten Programm verwendet werden, hängen davon ab, welche Dateien von diesem Programm geöffnet oder anderweitig verwendet wurden. Wenn Sie beispielsweise das aktuelle stdin "speichern" und stdin vorübergehend von einem anderen Ort umleiten und später wiederherstellen möchten, können Sie Folgendes tun:
Für dieses Skript wäre also
4
zumindest für einige Zeit ein Dateideskriptor verfügbar. Diese 4 kann alles sein, was nicht verwendet wird (nun, es gibt eine Begrenzung für die Anzahl der Dateien, die ein Prozess geöffnet haben kann, aber alles innerhalb dieser Begrenzung).Sie können sehen, welche Dateideskriptoren ein Prozess geöffnet hat und wo sie geöffnet sind, indem Sie nachsehen
/proc/<pid>/fd
. Das zeigt alle offenen Dateideskriptoren für diesen Prozess<pid>
und welche Dateien diesen zugeordnet sind.quelle
Jeder Prozess erhält Ganzzahlnummern als Dateideskriptoren, wobei es in POSIX drei reservierte gibt: 0 ist stdin, 1 ist stdout und 2 ist stderr. Alle weiteren Dateien erhalten weitere Nummern. Sie können es einfach mit diesem Programm überprüfen und als fdtest.c speichern , damit es zur Laufzeit seinen eigenen Programmcode öffnet:
Kompiliere es:
Starte es:
Die Ausgabe, die Sie erhalten, ist ungefähr so:
... das ist die Nummer des Dateideskriptors der Datei, auf die sich die Variable bezieht
fd
.quelle