![]() |
Sperren von Dateien: Programmiersprachenübergreifende Sperren |
Es kommt vor, dass man Programme / Scripte in verschiedenen Programmiersprachen hat, die gemeinsam eine Datei verwenden sollen. Unter Windows stellt dies kein Problem dar, da es dort nur einen einzigen Sperrmechanismus gibt. Daher ist es egal, mit welcher Programmiersprache die Datei nun unter Windows gesperrt wird - solange die Sperre korrekt durchgeführt wird, kommt sich nichts gegenseitig ins Gehege.
Unter UNIX-artigen Betriebssystemen sieht dies nun schwieriger aus, da sie theoretisch drei und effektiv zwei (lockf(3) nutzt praktisch überall fcntl(2), auch wenn dies in der Spezifikation nicht vorgeschrieben ist) verschiedene Mechanismen zum Sperren von Dateien unterstützen. Alle Beispiele für PHP, Perl und Python hier nutzen im Normalfall flock(2), d.h. sie sind untereinander kompatibel. Problematisch wird es, wenn Perl explizit mit fcntl(2)-Emulation installiert wurde oder Java dazukommen soll (oder ein anderes Programm in einer hier nicht behandelten Programmiersprache, das auch fcntl(2) verwendet). Denn Java nutzt unter UNIX-artigen Betriebssystemen immer fcntl(2). Daher bieten sich sich folgende Alternativen an:
dio-Erweiterung, mit der es möglich ist, per fcntl(2) Dateien zu sperren. Für die Nutzung der Bibliothek sollte man Ahnung von UNIX-Systemprogrammierung haben, da diese Funktionen lediglich Eins-zu-Eins-Schnittstellen zu den Kernel-Funktionen sind. Ferner verliert man hiermit seine Betriebssystemunabhängigkeit, da im Gegensatz zu flock die dio-Erweiterung auf anderen Betriebssystemen nichts emuliert.fcntl(2)-Emulation zu aktivieren (dabei muss Perl allerdings neu gebaut und installiert werden) und im Code weiterhin flock zu verwenden.fcntl.lockf statt fcntl.flock verwendet werden (was eine leicht andere Signatur besitzt). Da es unter Python sowieso keine plattformunabhängige Funktion für das Sperren von Dateien gibt, stellt dies kein größeres Problem dar.Die explizite Verwendung eines fcntl(2)-basierten Locking-Mechanismus steht im Konflikt mit der Abschottung gegenüber anderen
Threads.