Calocybe: Perl gleichzeitiger Dateizugriff

Beitrag lesen

Hi Hansi!
(Nimm's mir nicht uebel, Dein Name laesst sich zwar leicht schreiben, aber klingt der Qualitaet Deiner Beitraege nicht angemessen. ;-))

Das Problem ist, daß es eine kritische Phase gibt, nämlich genau zwischen dem Prüfen der Sperr-Datei und dem Anlegen der Sperrdatei. Wenn das zwei Prozesse gleichzeitig versuchen, dann sind beide drin in der gefährlichen Zone.

Stimmt, auch das kann passieren. Habe ich auch schon in erwägung gezogen.

Vor inzwischen ziemlich langer Zeit hatte jemand vorgeschlagen, nicht auf die Existenz einer Sperrdatei abzufragen, sondern auf die Nicht-Existenz. Dann koennte man naemlich mit dem unlink()-Befehl die Datei vom OS loeschen lassen, und dieses tut das ganz bestimmt nur einmal, denn es nutzt intern ohne Zweifel entsprechende Synchronisierungsmechanismen. unlink() gibt die Zahl der geloeschten Dateien zurueck, man weiss also, ob das Loeschen erfolgreich war oder man auf einen anderen Prozess warten muss. Ist ein Prozess mit seiner Arbeit fertig, muss er die Datei wieder anlegen, um einen evtl. wartenden Prozess weiterlaufen zu lassen.

Durch die Diskussion in diesem Thread habe ich ja einiges zur Verwendung von flock() erfahren.

Probier einfach ein bisschen mit flock() herum. Zum Beispiel Datei sperren, 10 Sekunden warten, waehrenddessen Script ein zweites mal starten. Das ganze dokumentierst Du mit Statusmeldungen, damit Du weisst, wo der Programmablauf gerade steht. Dann wirst Du sehen, ob der zweite Prozess wartet oder nicht und unter welchen Umstaenden und unter welchen nicht.

Ich habe mir auch schon überlegt, ob es vielleicht eine Möglichkeit gibt (wenn überhaupt sinvoll) die Warteschleife und flock zu kombinieren.

Halte ich durchaus fuer sinnvoll. Nehmen wir z.B. das Script fuer ein Forum wie dieses: Wuerdest Du den zweiten Prozess einfach abbrechen, wenn er die Kontrolle ueber eine bestimmte Datei nicht auf Anhieb bekommt, wuerde das den Verlust des Postings bedeuten, durch welches der zweite Prozess gestartet wurde. Also ruhig in einer Schleife ein paar mal probieren (ich verwende z.B. oft 10 Versuche mit je einer Sekunde Pause). Michael hat dazu ein paar interessante Kommentare geschrieben (daran hatte ich noch gar nicht gedacht).

Calocybe