Everything is a file
Everything is a file (englisch für Alles ist eine Datei) beschreibt eine der definierenden Eigenschaften von Unix und seinen Abkömmlingen, demnach Ein-/Ausgabe-Ressourcen wie Dateien, Verzeichnisse, Geräte (z. B. Festplatten, Tastaturen, Drucker) und sogar Interprozess- und Netzwerk-Verbindungen als einfache Byteströme via Dateisystem verfügbar sind.[1]
Der Vorteil dieses Ansatzes ist, dass dieselben Werkzeuge und Programmierschnittstellen für den Zugriff auf all diese Ressourcen genutzt werden können. Wenn eine Datei geöffnet wird, erhält das Programm vom Kernel einen Dateideskriptor. Für alle nachfolgenden Operationen dient dieser als Ein-/Ausgabe-Schnittstelle. Da auch für anonyme Pipes und Netzwerk-Sockets Dateideskriptoren angelegt werden, die jedoch keinen Pfad haben, wird das Prinzip des Öfteren auch Everything is a file descriptor (‚Alles ist ein Dateideskriptor‘) oder, nach Linus Torvalds, Everything is a stream of bytes (‚Alles ist ein Bytestrom‘)[2] genannt.
Zusätzlich existiert eine Reihe von virtuellen Dateisystemen und Pseudodateisystemen, die Informationen über den Systemzustand und Prozesse hierarchisch strukturiert verfügbar machen.
Der Begriff wird durchweg als Schlagwort für die Andersartigkeit von unixoiden Systemen im Umgang mit Dateien verwendet. Er ist jedoch nicht scharf abgegrenzt und zielt, wie oben angedeutet, je nach Verwendung auf verschiedene Aspekte ab. Während die oben genannten Eigenschaften auch heutzutage nur bei unixartigen Betriebssystemen vorzufinden sind und weithin mit everything is a file verbunden werden, sind von Unix auch Neuerungen ausgegangen, die mittlerweile allgegenwärtig sind. Die folgenden Abschnitte behandeln die Aspekte im Einzelnen.
Verzeichnisstruktur als Namensraum
Die Verzeichnisstruktur ist ein einheitlicher, hierarchisch gegliederter Namensraum, über den eine Datei einen Pfad erhält, unter dessen Namen sie verfügbar ist. Ein Verzeichnis ist eine spezielle Datei, die alle enthaltenen Verzeichniseinträge auflistet. Darunter können sowohl Dateien als auch wieder Verzeichnisse sein. Diese sich so ergebende Verzeichnishierarchie kann sich über verschiedene Geräte erstrecken. In dieser Form war das Dateisystem schon in Multics, einem Vorläufer von Unix, enthalten.[3] Derartige Verzeichnisstrukturen sind mittlerweile weit verbreitet, wenn auch mit gewissen Abweichungen. Beispielsweise sind sie bei MS-DOS und Windows nicht einheitlich: Pfade enthalten auch einen gerätespezifischen Laufwerksbuchstaben.
Der Namensraum wird auch von Named Pipes genutzt und dient als Grundlage für die weit verbreitete System-V-IPC-Schnittstelle, bei der existierende Dateien gewissermaßen als Treffpunkt zweier Prozesse fungieren.[4] Das POSIX-Analogon, POSIX-IPC-Namen, basieren nicht auf Dateien.[5]
Sekundärspeicher und Dateien
Eine weitere[6] Lesart des Prinzips, die heute nicht mehr verbreitet ist, bezieht sich auf die Neuerung, dass Dateien unter UNIX aus einer einfachen Aneinanderreihung von Bytes bestehen und darüber hinaus in ihrem Format keinen Einschränkungen unterworfen sind (im Gegensatz zu damals verbreiteten Datensatz-orientierten Dateisystemen).[6] Ziel war, Gerätespezifika einzuebnen, von der Speicherorganisation zu abstrahieren und möglichst viele Entscheidungen dem Userspace zu überlassen:
“[…] the UNIX kernel does not support file access methods, file disposition, file formats, file maximum size, spooling, command language, logical records, physical records, assignment of logical file names, logical file names, more than one character set, an operator’s console, an operator, log-in, or log-out. Many of these things are symptoms rather than features. Many of these things are implemented in user software using the kernel as a tool.”
„[...] Der UNIX-Kernel unterstützt keine Dateizugriffsmethoden, Dateidisposition, Dateiformate, maximale Dateigröße, Spooling, Befehlssprache, logische Datensätze, physische Datensätze, Zuweisung logischer Dateinamen, logische Dateinamen, mehr als einen Zeichensatz, eine Operatorkonsole, einen Operator, eine An- oder Abmeldung. Viele dieser Dinge sind eher Symptome als Merkmale. Viele dieser Dinge sind in Benutzersoftware implementiert, die den Kernel als Werkzeug verwendet.“
Dieses Verständnis von Dateien ist heute selbstverständlich und in den meisten Mainstream-Betriebssystemen vorzufinden.
Geräte
Die Idee, Geräte über Dateien verfügbar zu machen, stammt nach eigenen Angaben von Dennis Ritchie.[8]
Einzelnachweise
- Machtelt Garrels: Introduction to Linux. A Beginner’s Guide. 2. Auflage. Fultus, 2007, ISBN 1-59682-112-4, Abschnitt 3.1.1.1.
- Linus Torvalds: signalfd v2 – signalfd core. Abgerufen am 17. Januar 2013.
- R. C. Daley, Peter G. Neumann: A General-Purpose File System For Secondary Storage. In: AFIPS '65 (Fall, part I). Las Vegas 1965, S. 213–229 (online).
- Siehe ftok() Bibliotheksfunktion
- Marc J. Rochkind: Advanced UNIX Programming. 2. Auflage, Addison-Wesley, 2004, Kapitel 7.6.2.
- Brian W. Kernighan, Rob Pike: The UNIX Programming Environment. Prentice Hall, 1984, Kapitel 2.
- Ken Thompson: UNIX Implementation. In: Bell System Technical. 1978, Ausgabe 57, S. 1931–1946.
- Dennis Ritchie: The Evolution of the Unix Time-sharing System. In: Language Design and Programming Methodology. 25–35, Springer, Berlin/Heidelberg 1980, (online).