Angenommen, ich habe Prozess 1 und Prozess 2 . Beide haben einen Dateideskriptor, der der Ganzzahl 4 entspricht.
In jedem Prozess verweist der Dateideskriptor 4 jedoch auf eine völlig andere Datei in der Open File Table des Kernels:
Wie ist das möglich? Soll ein Dateideskriptor nicht der Index für einen Datensatz in der Open File Table sein?
kernel
open-files
file-descriptors
Pithikos
quelle
quelle
4
in beiden Prozessen relativ zur eigenen Anzahl offener fds ist. Fd's0-2
(stdin, stdout, sdterr) werden immer für einen neuen Prozess geöffnet und die Nummern sind nicht nur für diesen Prozess reserviert.Antworten:
Der Dateideskriptor, dh der
4
in Ihrem Beispiel, ist der Index in der prozessspezifischen Dateideskriptortabelle , nicht in der geöffneten Dateitabelle. Der Dateideskriptoreintrag selbst enthält einen Index zu einem Eintrag in der globalen offenen Dateitabelle des Kernels sowie Dateideskriptorflags.quelle
Jeder Prozess hat eine eigene Dateideskriptortabelle. Der Dateideskriptor 4 in Prozess 1234 zeigt in die Tabelle von Prozess 1234. Der Dateideskriptor 4 in Prozess 5678 zeigt in die Tabelle von Prozess 5678. Ein vertrauter Fall sind die Dateideskriptoren 0, 1 und 2, die für jeden Prozess die Standardeingabe, die Standardausgabe und den Standardfehler darstellen und zeigen, wohin diese umgeleitet wurden.
Ein Prozess kann dieselbe Datei mehrmals öffnen. Dies kann zufällig passieren, wenn beispielsweise die Standardausgabe und der Standardfehler eines Prozesses auf dasselbe Terminal oder dieselbe Datei umgeleitet werden. Die zugrunde liegenden Einträge in der Dateitabelle (z. B. Linux
struct file
) enthalten mehr als nur Informationen über die Datei. Sie enthalten auch Öffnungsmodi (z. B. Lesen oder Schreiben) und andere Zustände (z. B. Flags, z. B. Close-on-Exec). Beispielsweise könnte ein Prozess ein Terminal haben, das nur zum Lesen in Dateideskriptor 0 geöffnet ist, und dasselbe Terminal, das nur zum Schreiben in Dateideskriptor 2 geöffnet ist. Ein Prozess möchte möglicherweiselseek
zwei verschiedene Positionen in derselben Datei haben und verwendet diesedup
, um zwei Handles für diese Datei zu erhalten.quelle
dup
genau das, was es verspricht: Beide resultierenden Deskriptoren verweisen auf den gleichen Eintrag in der Dateitabelle und teilen sich damit den gleichen Versatz. Ich bin mir ziemlich sicher, dass Sieopen
die Datei zweimal benötigen, um zwei verschiedene Einträge in der Dateitabelle zu erhalten.Jeder Prozess hat eine eigene Dateideskriptortabelle. Das ist alles.
In der UNIX-Netzwerkprogrammierung von Richard Stevens ist alles sehr gut beschrieben, wenn Sie es gründlich lernen möchten.
quelle
Würde eine zusätzliche Indirektionsebene Ihr Problem nicht beheben? ("Alle Probleme bei der Computerprogrammierung können durch eine zusätzliche Indirektionsebene gelöst werden" - einigermaßen kluger Graubart). Das heißt, die kleine Ganzzahl in jedem Prozess endet als Index in einem Array von Kernel-Space-Indizes pro Prozess in der "Open File Table".
quelle