Beat Strasser: Perl gleichzeitiger Dateizugriff

Beitrag lesen

Hi there

open (DATEI, ">>datei.ext") or die ("$!: can‚t open datei.ext\n");
flock (DATEI, $LOCK_EX) or die ("$!: can‚t get lock\n");
print (DATEI "$string\n");

flock (DATEI, $LOCK_UN);
close (DATEI);

habe so bis jetzt noch keine bösen Überraschungen erlebt. :-)

Ich schon - damit werden nämlich nur Schreib- und keine Lesezugriffe gesperrt. Wenn eine Instanz die Datei gerade schreibt, kann eine andere Instanz dieselbe Datei immer noch lesen. Leider ist die Datei in dem Moment leer. Wenn dann Schreibzugriffe wieder erlaubt werden, wird die leere Datei ggf. wieder gespeichert - trotz flock. Hat mich einige Datenverluste gekostet, bis ich dann auf die genannte Variante umgestiegen bin.

Nach Theorie sollte nach einer Sperre das Betriebssystem den anderen Prozess solange anhalten bis der erste Prozess die Datei wieder freigibt. Man muss also auch bei nur lesenden Zugriffen ein File-Locking durchfuehren ($LOCK_SH = 1)!!
Man kann uebrigens auch testen, ob ein Lock gesetzt ist ($LOCK_NB = 4).
  flock(FH, $LOCK_EX $LOCK_NB) or print "locked\n";

Gruss,
Beat

[Quelle: c't 4/99]