Auf meinem Testrechner läuft MacOS 10.2.8. Da das auch auf einen UNIX Kernel basiert, sollte meinen, daß das hier gleich ist, muß aber sagen, daß ich das hier nicht so genau weiß (bei MacOS Classic verhielt es sich in etwa so, wie bei Windows). Ich vermute der Zielrechner, auf dem die HP läuft ist ein UNIX System.
Also, ich möchte eigentlich die aktuellste Version der Datei mit Prozess B bearbeiten. Und wenn diese gelöscht wurde, würde ich das schon gerne wissen, bevor ich diese auslese. Das größte Risiko stellt ja vermutlich die flock() Funktion dar, da nach der Wartezeit die Datei sich verändert haben kann.
QuoteDein Test auf Existenz der Datei mit "-e" unterliegt selber wieder einer Race Condition: Ein anderer Prozess kann die Datei nach dem Test und vor dem Öffnen trotzdem löschen.
Aber ist das dann nicht genau die Situation, die ich haben möchte? Prozess A startet, Prozess B muß warten. Prozess A löscht die Datei, während Prozess B darauf wartet, sie bearbeiten zu können. Prozess A hebt die Schutz auf, Prozess B ist am Zug. Der hat die Datei ja wiederum geschützt, also kann ein etwaiger Prozess C nix tun. Ich prüfe, ob die Datei noch existiert, und merke sie existiert nicht. Also spare ich mir das auslesen, weil die Daten des filehandles "veraltet" sind. Hebe den Schutz auf, Prozess C kann das gleiche tun.
Der andere Fall ist: Prozess A schreibt eine neue Version der Datei, während Prozess B im Lock ist, Prüfung der Dateiexistens ist positiv, also kann Prozess B die Daten auslesen. Frage: Liest er jetzt eigentlich die modifizierte Version, der Prozess A gerade geschrieben hat (also nach open, während flock() von Prozess B), auch mit korrekten EOF? Wenn ja ist ja alles perfekt, ich bekomme die aktuellsten Daten in jedem Falle.
Worauf ich hinaus will ist folgendes, korrigiert mich, wenn es nicht stimmt. Da ich immer schön mit flock() arbeite, kann die Race Condition nicht ziehen, da flock() immer wartet, das heißt, die Prozesse nacheinander bearbeitet werden. Eine Datei hat immer den Exclusiven Schutz, während alle Anderen warten müssen. Stimmt das?
Vielen Dank noch mal.
PS: Was genau ist eigentlich eine Race Condition, bzw wie funktioniert das?