Ich versuche, das ganze Bild mit Dateideskriptoren zu bekommen. Angenommen, ich habe process1, das anfangs die folgenden Dateideskriptoren hat:
_process1_
| |
| 0 stdin |
| 1 stdout |
| 2 stderr |
|__________|
Dann schließe ich Dateideskriptor 1:
close(1);
Der Dateideskriptor 1 übersetzt (zeigt) in die stdout FILE-Struktur in der Open Files-Tabelle des Kernels .
Mit dem obigen Code wird der Dateideskriptor 1 aus der Prozesstabelle gelöscht.
_process1_
| |
| 0 stdin |
| 2 stderr |
|__________|
Aber was passiert im Kernel? Wird die stdout
Dateistruktur freigegeben? Wie ist das möglich, wenn stdout eine spezielle Datei (der Monitor) ist und wahrscheinlich von anderen Prozessen verwendet wird? Was ist mit FILE-Strukturen, die nur normale Dateien sind (z. B. TXT)? Was ist, wenn eine solche Datei von einem anderen Prozess verwendet wird?
quelle
open
erfolgreich ist .In diesem Fall wird nicht viel passieren. stdin, stdout und stderr alle neigen dazu Klone aus dem gleichen Dateideskriptor zu sein. Der Referenzzähler für den Dateideskriptor wird um eins dekrementiert. Derselbe Dateideskriptor wird normalerweise von der Shell gespeichert, von der aus das Programm ausgeführt wurde. Daher muss der Dateideskriptor beibehalten werden.
Der Kernel führt Referenzzählungen für alle geöffneten Dateien (Inodes). Solange der Referenzzähler größer als Null ist, bleibt die Datei erhalten. Ich würde erwarten, dass für offene Dateihandles ein separater Zähler geführt wird. Sobald dies Null erreicht, kann der Kernel den vom Datei-Handle verwendeten Speicher freigeben.
Wenn alle Verweise auf die Datei (Verzeichniseinträge und Datei-Handles) entfernt wurden, wird das Dateisystem-Code den Inode für die Wiederverwendung markieren. Alle Blöcke, die die Datei enthält, werden für die Zuordnung zur Verfügung gestellt. Viele Dateisysteme löschen die Blockzeiger im Inode, wenn dieser freigegeben wird. Dies erschwert die Wiederherstellung einer gelöschten Datei. Aktualisierungen der Festplatte werden möglicherweise gepuffert und zu einem späteren Zeitpunkt abgeschlossen.
quelle
cat > some.file
-da kontrollierst , erhält cat einen EOF für stdin, die Shell jedoch nicht. (2) Warum Referenzzählung? Warum nicht irgendeine Form von Garbage Collection? Ist das nicht GC weit besser im User - Space?cat > some.file
was seine eigentlich Forking tun, eröffnen ‚some.file‘ und es Dateideskriptor 1 zuweisen, dann tut esexec("cat")
. Wenn ein Prozess exec () 'd ist, erbt er die geöffneten Dateideskriptoren.