Andreas Korthaus: Wie ist das jetzt genau mit flock?

Beitrag lesen

Hallo!

vorne weg: Der PERL Befehl flock greift, meines Wissens nach, auf eine Funktion der C-Library zurück. Die Speere kann somit auch für Prozesse gelten, die gar nichts mit PERL zu schaffen haben.
Es gibt zwei wichtige Arten von flock:

  1. flock(FILE, LOCK_EX)
    Ein Script wartet solange bis es eine exclusive Spere für FILE erhält. Wenn die Spere erteilt ist kann kein anderer Prozess mehr lesend oder schreibend auf FILE zugreifen (natürlich nur falls der andere Prozess mit flock arbeitet).

  2. flock(FILE, LOCK_SH)
    LOCK_SH steht für shared lock. d.h. mehre Prozesse können gleichzeitig auf FILE lesend zugreifen. LOCK_SH stellt also sicher, daß FILE nicht während des lesens verändert wird.

Dazu habe ich mal eine Frage. Irgendwann brauchte ich mal einen sehr sicheren Counter, der es nicht zulassen durfte das 2 mal dieselbe Zahl gelesen werden darf.

Es ging um ein Script, welches sich aus einer txt-Datei eine Zahl eingelesen hat, diese um 1 erhöht hat und die neue Zahl wieder zurückgeschreiben hat.

also sowas

fopen(FILE)
$data = fread()
fputs($data++)
fclose()

etwas vereinfacht.

Das habe ich probiert mit einem flock sicher zumachen:
fopen(FILE)
flock(LOCK_EX)
$data = fread()
fputs($data++)
fclose()

Nur wenn jetzt 2 User (fast) gleichzeitig drauf zugreifen, könnte es doch passieren dass der erste User die Datei öffnet, und bevor er die Datei sperrt liest der 2. User die Datei ein, oder? Oder kann sowas definitiv nicht passieren?

Grüße
Andreas