Ein zweiteiliges Frameset ruft in jedem Frame das gleiche Perl-Script auf (nur unterschiedliche Parameter). Das Perlscript (ist ja in beiden Fällen das gleiche) schreibt beim Aufruf in eine Datei. Diese Datei wird dabei mit flock gesperrt. D.h. es greifen mehr oder weniger 2x das gleiche Script auf die gleiche Datei zu. Könnte es das Probleme geben oder erfolgen die Zugriffe auf diese Datei auf JEDEN Fall zeitlich versetzt?
Das Problem liegt nämlich darin: Das Script liest zuerst die Datei. Fehlt dort ein Eintrag generiert das Script ein zufällige Zahl und schreibt diese in die Datei.
Was wäre jedoch wenn nun „das andere“ Script auch grad liest und ebenfalls eine Zufallszahl rein schreibt. Folge wäre jedem Script wäre ja eine andere Zufallszahl bekannt.
Die soll aber bei den Scripten identisch sein. Das welches eher „schreibt“ bestimmt die zahl.
Konntet Ihr mein Problem verstehen? Kann mir das mal jemand erklären wie das aufläuft bzw. ablaufen könnte.
mfg Slick
Zusatzfrage: Was passiert eigentlich wenn die Datei grad mit flock gesperrt ist und ein Script rein schreiben will. Wartet es oder schreibt es garnix rein?
Das Problem liegt nämlich darin: Das Script liest zuerst die
Datei. Fehlt dort ein Eintrag generiert das Script ein
zufällige Zahl und schreibt diese in die Datei.
Was wäre jedoch wenn nun „das andere“ Script auch grad liest
und ebenfalls eine Zufallszahl rein schreibt. Folge wäre jedem
Script wäre ja eine andere Zufallszahl bekannt.
Die soll aber bei den Scripten identisch sein. Das welches
eher „schreibt“ bestimmt die zahl.
Konntet Ihr mein Problem verstehen? Kann mir das mal jemand
erklären wie das aufläuft bzw. ablaufen könnte.
Zusatzfrage: Was passiert eigentlich wenn die Datei grad mit
flock gesperrt ist und ein Script rein schreiben will. Wartet
es oder schreibt es garnix rein?
Du musst lediglich sichersetllen, dass das erste Script, das die Aktion beginnt, diese auch vollständig zu Ende führen kann - heisst: Script A Öffnet die Datei, Lock-t sie, bearbeitet sie, schreibt die Zahl rein und schliesst die Datei (damit wird auch der Lock freigegeben. Das Script darf die Datei also solange nicht freigeben bis die ganze Aktion abgeschlossen ist. Würde sie nach dem Lesen die Datei freigeben, könnte Script B zuschlagen, Lesen und eventuell sogar schreiben Schreiben und dann käme wieder Script A und würde nochmal die Zahl schreiben, da es festgestellt hat sie war noch nicht drin.
Du musst lediglich sichersetllen, dass das erste Script, das
die Aktion beginnt, diese auch vollständig zu Ende führen kann
heisst: Script A Öffnet die Datei, Lock-t sie, bearbeitet
sie, schreibt die Zahl rein und schliesst die Datei (damit
wird auch der Lock freigegeben. Das Script darf die Datei also
solange nicht freigeben bis die ganze Aktion abgeschlossen
ist. Würde sie nach dem Lesen die Datei freigeben, könnte
Script B zuschlagen, Lesen und eventuell sogar schreiben
Schreiben und dann käme wieder Script A und würde nochmal die
Zahl schreiben, da es festgestellt hat sie war noch nicht
drin.
Was macht Script B in der Zeit wenn Script A die Datei noch gesperrt hat? Warten???
Erkläre mir mal bitte genauer den Ablauf wenn ANGENOMMEN beide Scripts zur gleichen Zeit starten. Wer ist dann eher und was macht dann der jeweils andere?
Und was ist wenn Script A die Datei erst erstellt. Script B prüft ob die Datei da ist, findet diese aber nicht weil A die grad erst erstellt oder wie? Also würde B die auch nochmal erstellen wollen.
mfg Slick
PS: Hätte nie gedacht das ich mal mit paar Millisekunden solche Probleme bekommen könnte
Im Moment ist es etwa so… wie müßte ich das ändern zum das
File für beide Zugriffe in einem zu sperren?
mfg Slick
$LOCK_EX = 2;
$LOCK_UN = 8;
Lesen:
open(FILE, " open(FILE, "+;
—> raus, sonst könnte der andere beginnen :&unlock(FILE);
—> raus, s.o. :close(FILE);
Eingaben auswerten hier
neue Werte zurückschreiben:
—> raus, ist noch offen :open(FILE, „>datei.txt“) || die „Fehler …“;
—> seek(FILE, 0, 0);
—> truncate(FILE, 0);
—> wech damit, brauchst Du nicht :&lock(FILE);
for (@lesen) {print FILE $_;}
close(FILE);
sub lock {
local($file)=@_;
flock($file, $LOCK_EX);
}
sub unlock {
local($file)=@_;
flock($file, $LOCK_UN);
}
So, jetzt geht’s nach dem Prinzip, wer zuerst kommt, mahl zuerst und kann nicht unterbrochen werden bevor er nicht fertig ist.
Was macht Script B in der Zeit wenn Script A die Datei noch
gesperrt hat? Warten???
Ja
Erkläre mir mal bitte genauer den Ablauf wenn ANGENOMMEN beide
Scripts zur gleichen Zeit starten. Wer ist dann eher und was
macht dann der jeweils andere?
einer kommt immer eher an den Lock.
Und was ist wenn Script A die Datei erst erstellt. Script B
prüft ob die Datei da ist, findet diese aber nicht weil A die
grad erst erstellt oder wie? Also würde B die auch nochmal
erstellen wollen.
nein, siehe korrigierte Scriptversion im nächsten Beitrag