… aber verstehen, warum das funktioniert tu ich nicht
Ich habe mir das ganze von einem PERL Programm abgelunzt *g*
es gibt 2 sub´s
sub Lock {
local ($lockname) = shift;
local ($endtime);
$endtime = time + 10;
while ((-e "$lockname") && (time $lockname");
} #end lock sr
sub Unlock {
local ($lockname) = shift;
close (LOCKFILE);
unlink ("$lockname");
} # end Unlock sr
der aufruf erfolgt ganz einfach bevor ich eine Datei öffne.
ca. so hier:
&Lock("lock.file");
open (FILE, "\>\>$filename") or die "geht nicht";
print FILE ("$reindamit\n");
close (FILE);
&Unlock("lock.file");
so, kann mir jetzt mal Einer erklären, wieso das funzt?
da wird doch gar nix gelockt oder doch?
Also, das is ja mal n ganz schlechtes Locking
aber erklären kann ichs dir schon…
beim ersten Aufruf von Lock erstellt er eine Datei mit dem Namen „lock.file“, dann arbeitet er mit der eigentlichen Datei und löscht die „lock.file“ wieder.
Wenn nun ein zweiter Prozess zugreift, bleibt er in der while-Schleife hängen, weil eine Datei „lock.file“ existiert und legt den Proezss eine Sekunde schlafen, danach prüft er wieder ob die Datei inzwischen weg ist, wenn nicht legt er sich wieder ne Sekunde schlafen… anscheinend ist das aber auch nicth so zuverlässig und der Programmierer hat noch ne Bedingung eingebaut, dass der Prozess maximal 10 Sekunden nach anstarten trotzdem weiterarbeitet…
danke für die Erklärung
Meine Quelle ist das ubb Forum in der neuesten Version. Ich habe es für einen Kunden installiert und habe mal geschaut, wie die ‚Spezialisten‘ von Infopopup das so gelöst haben mit dem file locking.
Ich schätze eigendlich die Programmierkenntnisse von den Programmierern hoch ein, da das ubb sehr zuverlässig arbeitet und eines der besten Forensystem ist, die ich kenne.
Aber so wie Du mir das erklärt hast, scheint das wohl echt eine eher schlechte Lösung zu sein
Vielleicht haben die Leute von Infopopup das auch nur wegen der Systemunabhängikeit getan (Unix conta Win?). Ich weiss es nicht.
Also muss ich mich doch nochmal schlau machen, was das ‚flock‘ angeht
Ich halte von dem Code mal so ziemlich gar nichts, allerdings habe ich auch keine Ahnung, wie flock() eigentlich implementiert ist, aber ich denke mal das ist wesentlich zuverlässiger, sofern das Betriebssystem eben das file locking unterstützt.
while ((-e „$lockname“) && (time $lockname");
} #end lock sr
ein konkurrierender Zugriff erfolgt. Ist zwar relativ unwahrscheinlich, aber möglich. Dann funktioniert das Locking nämlich nicht und peng, hast du deine Dateninkonsistenz. Am besten, man verwendet für locking-kritische Aufgaben Datenbanken.