Tom: race-condition-Nachfrage

Beitrag lesen

Hello,

// Datei mit Schreibrechten öffnen und Inhalt löschen
$handle = fopen($login_file, "w");

Wenn Du die Datei hier schon platt machst, wofür hast Du die dann überhaupt mal erstellt?

Die Regeln lauten:

LESEN:

Zum reinen Auslesen von Daten genügt ein LOCK_SH um zu verhindern, dass jemand anders während des eigenen Leseprozesses, bestehend aus mehreren Lesevorgängen, die Daten verändert.

VERÄNDERN:

Zum Veräandern der Daten:
Erst Datei sperren mit LOCK_EX
dann die alten Daten LESEN
dann die gelesenen Daten verändern
dann die geänderten Daten an die passende Stelle zurückschreiben
(je nach Dateimodell geht das nur dateiweise,
 ab einer bestimmten Stelle für den Rest der Datei,
 oder auch satzweise oder sogar elementweise bei Random-Access-Dateien)
dann die Datrei auf die neu gültige Länge kürzen, wenn diese kürzer als die alte ist
dann die Datei SCHLIESSEN und keinesfalls vorher entsprerren

Die Entsprerrung muss auf jeden Fall durch das fclose() erledigt werden.
Wenn man sich das Leben schwer machen will, kann man zur Not auch ein fflush() benutzen.
Anderenfalls könnten noch Teile der Datei im Buffer des Prozesses stehen.
Wird die Datei nun durch ein flock(...,LOCK_UN) freigegeben, dann könnte ein anderer Prozess schon wieder einlesen, aber bekommt den Bufferinhalt nicht mit. Der würde dann erst durch ein fclose() geschrieben werden, was dann verheerende Folgen haben könnte.

Liebe Grüße aus dem schönen Oberharz

Tom vom Berg

--
Nur selber lernen macht schlau
http://bergpost.annerschbarrich.de