Jede Datei in einem konventionell gestalteten UNIX-Dateisystem, deren Referenzanzahl (z. B. die Summe aus Hardlinkanzahl und Anzahl der geöffneten Dateihandles *) 0 erreicht, wird entfernt. Doch auf modernen UNIX - Systemen, die rmdir
entfernt Systemaufruf ein leeres Verzeichnis in einem einzigen Arbeitsgang , anstatt zu entfernen .
und ..
eine-by-one.
In historischen UNIX-Systemen war dieser Systemaufruf jedoch nicht vorhanden. Stattdessen war der rmdir
Befehl ein setuid-Programm ( Quellcode finden Sie hier ), das überprüfte, ob ein Verzeichnis leer war (außer den speziellen Einträgen), und dann entfernt ..
und .
in dieser Reihenfolge das Verzeichnis selbst entfernte, alles mit dem unlink
Systemaufruf, den nur root für Verzeichnisse verwenden durfte (daher wurde der Befehl setuid). Auf diesen Systemen wäre die Verbindungsanzahl eines Verzeichnisses momentan 1, nachdem sie .
entfernt wurde, aber bevor das Verzeichnis aus dem übergeordneten Verzeichnis entfernt wurde, wäre es 0.
Der rm
Befehl verhinderte übrigens, dass sogar root Verzeichnisse entfernte. Und rm -r
würde den rmdir
Befehl aufrufen , Verzeichnisse nach dem Leeren ihres Inhalts zu entfernen.
Auf diesen historischen Systemen kann der Missbrauch des unlink
Aufrufs eines Programms, das als Root ausgeführt wird, mit rmdir
oder in eine Race-Bedingung gerät oder mv
eine Datei in einem Prozess erstellt, dessen aktuelles Verzeichnis gelöscht wurde (moderne Systeme verhindern dies), dazu führen, dass Dateien oder Verzeichnisse baumeln die eine Hardlink-Anzahl über 0 haben, aber nicht im Verzeichnisbaum vorhanden sind. Dieser Zustand wurde von erkannt dcheck
und ist immer noch einer der Eincheckvorgänge, fsck
da er auf den meisten Dateisystemen physisch möglich bleibt.
Dateisysteme müssen im Übrigen keine Verzeichnisse (einschließlich .
und ..
) als normale Dateien mit Hardlinks implementieren . Auf diesen Dateisystemen wird die Hardlink-Anzahl eines Verzeichnisses immer als gemeldet 0
(aber natürlich ist seine Existenz im übergeordneten Verzeichnis für eine "Referenzanzahl" von 1 qualifiziert).
Das Verhalten eines entfernten Verzeichnisses (z. B. wenn es von einem Prozess untersucht wird, der es bereits geöffnet hat oder als aktuelles Verzeichnis hat) und die genaue Bedeutung der "Linkanzahl" eines Verzeichnisses sind nicht angegeben. Unter Mac OS X wird beispielsweise eine Hardlink-Anzahl von 2 gemeldet , obwohl keine echten Hardlinks vorhanden sind. Obwohl .
und ..
nicht in der Liste stat
angezeigt , kann das Verzeichnis geöffnet und mit dem Namen .
oder aufgerufen werden ..
. Unter Linux ist der Linkzähler 0 aber .
und ..
ebenfalls noch Arbeit.
Mac OS X gibt auch die Anzahl aller Dateien in einem Verzeichnis als Linkanzahl an, anstatt nur die Anzahl der Unterverzeichnisse. Aber es ist 2, auch wenn .
und ..
weg sind.
* Dies umfasst normale offene Deskriptoren, speicherabgebildete Abschnitte (einschließlich z. B. Ausführen von Binärdateien und gemeinsam genutzten Bibliotheken) und die Verarbeitung aktueller Verzeichnisse.
..
, nur wenn es ein Unterverzeichnis hat, richtig? Ist..
also nicht immer für ein Verzeichnis vorhanden, oder?