Wenn ich folgendes mache:
touch /tmp/test
und dann durchführen
ls -la /tmp/
Ich konnte die test
Datei mit 0 Bytes im Verzeichnis sehen.
Aber wie geht das Betriebssystem mit einem Konzept von um? 0 Bytes . Wenn ich es als Laie formuliere:
0 Bytes ist überhaupt kein Speicher, daher wird nichts erstellt.
Erstellen einer Datei, muss oder sollte zumindest bestimmte Speicher erfordern, oder?
linux
files
filesystems
Shan-Desai
quelle
quelle
Antworten:
Eine Datei besteht (ungefähr) aus drei verschiedenen Dingen:
Wenn Sie eine leere Datei erstellen, erstellen Sie nur den Inode und einen Verzeichniseintrag, der auf diesen Inode verweist. Gleiches gilt für Dateien mit geringer Dichte (
dd if=/dev/null of=sparse_file bs=10M seek=1
).Wenn Sie Hardlinks zu einer vorhandenen Datei erstellen, erstellen Sie lediglich zusätzliche Verzeichniseinträge, die auf denselben Inode verweisen.
Ich habe die Dinge hier vereinfacht, aber Sie haben die Idee.
quelle
touch
ein schaffen wird Inode undls -i
oderstat
zeigt Informationen über den Inode:Beachten Sie, dass
test
0 Blöcke verwendet werden. Zum Speichern der angezeigten Daten verwendet der Inode einige Bytes. Diese Bytes werden in der Inode-Tabelle gespeichert. Auf der Seite ext2 finden Sie ein Beispiel für eine Inode-Struktur .quelle
ls
(oder auch derstat(2)
Systemaufruf) gibt Auskunft über die Größe des Inhalts der Datei. Wie viel Speicherplatz das Dateisystem für die Buchhaltung benötigt, gehört nicht dazu, und als Implementierungsdetail sollten sich Programme im Allgemeinen nicht darum kümmern oder auch nur darüber Bescheid wissen. Das Sichtbarmachen der Implementierungsdetails würde die Dateisystemabstraktion weniger nützlich machen.quelle
Die Datei selbst belegt keinen Speicherplatz, das Dateisystem jedoch speichert Dateinamen, Speicherort, Zugriffsrechte und dergleichen.
quelle
Einfache Antwort: Weil es so definiert ist.
Längere Antwort: Es ist so definiert, weil einige Operationen konzeptionell einfacher sind:
Sie können noch mehr tun: * Fehlerprotokolldateien werden in der Regel leer erstellt und nur dann gefüllt, wenn ein Fehler auftritt. * Um herauszufinden, wie viele Fehler aufgetreten sind, zählen Sie die Anzahl der Zeilen in den Protokolldateien. Wenn die Protokolldatei leer ist, ist die Anzahl der Fehler Null, was durchaus Sinn macht. * Manchmal sehen Sie Dateien, in denen der gesamte relevante Text im Dateinamen enthalten ist, z . B. oder .
this-is-the-logging-directory
. Auf diese Weise wird verhindert, dass überlastete Administratoren nach der Installation leere Verzeichnisse löschen. Außerdem wird verhindert, dass ein Programm oder ein Benutzer versehentlich eine Datei erstellt, in der das Programm später ein Verzeichnis sehen möchte. Dasgit
Programm (und andere) ignorieren leere Verzeichnisse. Wenn ein Projekt / Administrator / Benutzer einen Datensatz haben möchte, in dem das Verzeichnis vorhanden ist, obwohl es (noch) keinen nützlichen Inhalt hat, wird möglicherweise eine leere Datei mit dem Namen angezeigtempty
empty.directory
Keine Operationen werden komplizierter:
Bei Dateien kommt der Aspekt "Es ist eine Datei irgendwo aufgezeichnet" (Inode und / oder Dateiname) zu den obigen Überlegungen hinzu, aber Dateisysteme würden dies nicht tun, wenn leere Dateien unbrauchbar wären.
Im Allgemeinen gelten alle oben genannten Gründe mit Ausnahme derjenigen, die sich auf Dateinamen beziehen, für Sequenzen. Vor allem bei Strings, bei denen es sich um Sequenzen von Zeichen handelt: Strings mit einer Länge von Null sind in Programmen alltäglich. Zeichenfolgen sind auf Benutzerebene normalerweise nicht zulässig, wenn sie keinen Sinn ergeben: Ein Dateiname ist eine Zeichenfolge, und die meisten Dateisysteme lassen keine leere Zeichenfolge als Dateinamen zu. Intern kann das Programm beim Erstellen von Dateinamen aus Fragmenten eine leere Zeichenfolge als eines der Fragmente haben.
quelle
Mit der einfachsten Analogie:
Vergleichen wir eine Akte beispielsweise mit einem Glas Wasser.
'touch / tmp / test' ähnelt sehr der Herstellung eines leeren Glases, in dem sich kein Wasser befindet. Das Glas ist leer, also ist es gleich Null. Aber das Glas existiert.
In der Dateisystemsprache sind das Glas die Metadaten, während der Inhalt des Glases die Daten sind. Die Metadaten enthalten alle möglichen Dinge, wie in den vorherigen Beiträgen erwähnt.
Dateien mit der Größe Null können nützlich sein. Ein Beispiel ist die Verwendung als Breadcrumb, wobei die bloße Existenz verwendet werden kann, um einen Zustand anzuzeigen (dh, wenn die Datei vorhanden ist: dann tue etwas, wenn nicht: ignoriere).
quelle
Stellen Sie sich das so vor: Angenommen, ein Programm verfolgt SQL-Abfragen, die an Ihren Server gesendet wurden. Das Programm möchte anzeigen, dass Anforderungen in einer Nur-Text-Datei protokolliert werden, es wurden jedoch noch keine Anforderungen protokolliert. Wie soll das aussehen? Ich würde argumentieren, dass es eine Datei mit der Größe Null sein sollte
/var/log/acme-sql-server/queries.log
. Auf diese Weise können Sie herausfinden, wann die Protokollierung gestartet wurde (Erstellungszeit der Datei), wann sie zuletzt aktualisiert wurde (dh wann sie erstellt wurde), wie viele Abfragen aufgezeichnet wurden (Anzahl der Zeilenumbrüche in Datei = 0) und wer die Protokollierung durchführt (Acme SQL Server). In solchen Fällen ist es nützlich, das Konzept einer leeren Datei zu haben, die dennoch an einem bestimmten Ort vorhanden ist.quelle