|

Wozu benötigen wir Dateisperren? Wenn mehrere Prozesse auf eine Datei
zugreifen und in diese Datei schreiben wollen.
Zum bei CGI-Skripts wie ein Gästebuch oder ein Besucher-Counter.
Zwei Besucher auf Ihrer Seite tragen sich gerade ins Gästebuch ein und
wollen zur gleichen Zeit in die selbe Datei schreiben. Die Folge wäre
ein Datensalat. Als Abhilfe dafür benutzen wir dazu Dateisperren.
Wie kann man nun ein ganze Datei sperren? Sehen wir uns dazu am Besten
ein Beispiel an....
#!/usr/bin/perl -w
use Fcntl qw(:DEFAULT :flock);
open(FH, ">>test.txt") or die "open : $!\n";
flock(FH, LOCK_EX) or die "Fehler flock : $!\n";
#Ab hier kann kein anderer Prozess mehr auf die Datei zugreifen
print FH "Dieser Text kann nur von PID $$ geschrieben werden\n";
flock(FH, LOCK_UN) or die "Fehler flock $!\n";
#Jetzt können wieder andere Prozesse auf test.txt zugreifen
close FH;
Die erste Frage dürfte nun lauten, was passiert wenn User1 auf in die Datei
schreibt und 1 Sekunde darauf User2 und der Schreibvorgang von User1 war noch
nicht fertig? Es passiert gar nichts. User2 wird solange blockiert bis
User1 die Dateisperre wieder freigibt.
Zwei Arten von Sperren können sie verteilen. In unserem Beispiel haben
wir eben LOCK_EX, ein exklusive Sperre verwendet. Mit dieser Sperre
stellen sie sicher, das niemand anderes während dieser Zeit diese Datei
lesen noch beschreiben kann.
Die zweite Möglichkeit währe eine gemeinsame Sperre (LOCK_SH).
Mit dieser dieser Sperre können wir reallisieren das ein Prozeß
ein Exklusiv-Sperre erhält, damit der Prozeß mit der Exklusiv-Sperre,
die Lesenden Prozesse nicht stört. Das daher weil ja alle Prozesse
ein Sperre erhalten haben (shared lock).
Sperren sind übrigens nicht mit Zugriffsrechte gleichzusetzen.
Es sorgt immer für Verwirrung das man trotz einer Sperre die Datei lesen
kann. Die Sperre gilt nur für Prozesse die ebenfalls mit flock,
versuchen darauf zurückzugreifen.
Bei CGI-Skripts brauchen sie sich somit keine Gedanken darum machen.
Es seie denn, Jemand weiß wo sich das zu beschreibene File befindet
und sie haben die Zugriffsrecht falsch gesetzt.

© 2001,2002 Jürgen Wolf
|