[PERL] Interessante Art eine Datei zu locken

… aber verstehen, warum das funktioniert tu ich nicht :wink:

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?

bye,
Martin

Also, das is ja mal n ganz schlechtes Locking :wink:
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…

Verwende das bloss nicht! :smile:

Bruno

huhu

danke für die Erklärung :wink:
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 :frowning:
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 :frowning:

Danke nochmal :wink:

bye,
Martin

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.

Bruno

Das Problem ist, wenn zwischen hier

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.

Gruß,

Michael