![]() |
Sperren von Dateien: Dateisperren in verschiedenen Betriebssystemen |
|
| |
In diesem Abschnitt werden die Locking-Mechanismen unter den verschiedenen Betriebssystemen näher erläutert. Dies sind Hintergrundinformationen, die für den praktischen Einsatz nicht unbedingt relevant sind, da viele Sprachen wie Java, PHP oder Perl Abstraktionsschichten anbieten, die es ermöglichen, Dateien zu sperren, ohne sich um die Eigenheiten des Betriebssystems Sorgen zu machen. Daher kann dieser Abschnitt auch gerne übersprungen werden.
Unter UNIX-artigen Betriebssystemen wie Linux, FreeBSD oder Mac OS X sind Dateisperren im Normalfall immer kooperativ. Zudem gibt es aus historischen Gründen drei verschiedene Mechanismen, mit deren Hilfe eine Datei gesperrt werden kann. Hinzu kommt noch, dass die verschiedenen Spezifikationen nicht fordern, dass diese Mechanismen kompatibel zueinander sind - was auf Grund der Freiwilligkeit dazu führt, dass man als Programmierer Sorge tragen muss, dass alle Programme den gleichen Mechanismus verwenden.
Folgende Mechanismen stehen zur Auswahl, sie werden von allen oben genannten UNIX-artigen Betriebssystemen unterstützt:
flock(2)fcntl(2)fcntl ist ferner eine allgemeine Systemfunktion zur Manipulation von Dateideskriptoren, das Setzen von Sperren ist nur eine Aufgabe, die mit ihrer Hilfe erledigt werden kann. Zudem besitzen Sperren, die durch fcntl(2) angelegt wurden, den Nachteil, dass alle Sperren auf eine Datei, die ein Prozess geöffnet hat, beim Schließen eines Dateideskriptors aufgehoben werden - selbst wenn die Datei anderweitig vom selbstn Prozess noch geöffnet ist.lockf(3)fcntl auf, dies ist jedoch nicht im Standard vorgeschrieben, und man sollte sich nicht darauf verlassen, dass diese beiden Locking-Mechanismen miteinander kompatibel sind.Um sogenanntes mandatory locking unter Linux zu aktivieren, muss man das Dateisystem mit der Option mand mounten (die man zum Beispiel in die /etc/fstab schreiben kann), und bei jeder Datei, die so gesperrt werden soll, muss das Set-Group-ID-Bit in den Dateirechten gesetzt und das Group-Executable-Bit gelöscht sein, was man über chmod g-x+s datei erreichen kann. In dem Fall sind alle Sperren, die über fcntl (nicht jedoch flock!) eingerichtet werden, verpflichtend anstelle von freiwillig. Allerdings schützt dies auf Grund der Dateizugriffssemantiken von Linux nicht vor dem Löschen der Datei selbst (und beispielsweise anschließendem Wiederanlegen).
Dateisperren unter Microsoft Windos sind immer verpflichtend. Sobald eine Datei über die Windows-API-Funktion CreateFile geöffnet wurde, kann sie über die API-Funktion LockFileEx gesperrt werden. Diese unterstützt sowohl exklusive als auch mitbenutzbare Sperren sowie auch Dateibereiche. Kooperative Sperren werden von Windows dagegen nicht unterstützt (auch wenn sie über bestimmte Tricks mit verpflichtenden Sperren simuliert werden können).
Zu beachten ist, dass Dateisperren nur unter NT-basierten Betriebssystemen (wie Windows NT, 2000, XP, 2003 oder Vista) mit NTFS als Dateisystem zuverlässig funktionieren.