flock - widersprüchliche Aussagen im Archiv ?
Frank Scharffenberg
- perl
Hallo Forumer!
Bei der Suche nach einer Lösung zur Syncronistion paralleler Prozesse bin ich auf widersprüchliche Aussagen im Archiv gestoßen </selfhtml/sfarchiv/2000_1/t10343.htm>:
Dieser Ansatz verfolgt ein Konzept, bei dem bei zu langer Wartezeit auf die Freigabe eines Files durch einen anderen Prozess eine Fehlermeldung ausgegeben wird:
<cite 1>
$timeout=10000; #how long the script waits between attempts to get a lock
$exit=100; #how many attempts to get a lock before exiting the script
open (FILE, "file");
if (!flock(FILE,2))
{
until ($released eq TRUE or $x>$exit) {
# little timeout
$i=0;
for ($i=0;$i<$timeout;$i++) {}
#count attempts
$x++;
if (flock(FILE,2)) {$released=TRUE;}
} # end until
} # end if
if ($exit>100) {
print "Server too busy, please try again.";
close(FILE);
die;
}else {
# lock file
flock(FILE,2);
# do your sutff { }
close(FILE);
} # end else
</cite 1>
<cite 2>
Was soll das denn? "flock FILE,2" wartet solange, bis der andere Prozess / die anderen Prozesse das File wieder
freigeben haben. Wenn Du nur pruefen willst, ob eine Datei gelockt ist, musst Du LOCK_SH/LOCK_EX _und_ LOCK_NB
benutzen.
</cite 2>
Nach der 2. Aussage würde der Ansatz der ersten Lösung wirkungslos sein, denn der Prozess würde solange am ersten flock stehen, bis das File vom anderen Prozess wieder freigegeben wird.
Oder sehe ich was falsch?
Gruß Frank
Hi!
Nach der 2. Aussage würde der Ansatz der ersten Lösung wirkungslos sein, denn der Prozess würde solange am ersten flock stehen, bis das File vom anderen Prozess wieder freigegeben wird.
Genau. Es ist doch klar zu erkennen, dass Cruz sich seiner Sache keineswegs sicher war.
Bye
Hi Calocybe!
Genau. Es ist doch klar zu erkennen, dass Cruz sich seiner Sache keineswegs sicher war.
Aber der Vorschlag im Posting <../../sfarchiv/2000_1/t10343.htm#a52216> schien ja Cruz' eingültige Lösung zu sein, zumal sie ja als Anwort auf das posting von Peter kam.
Gruß Frank
Hallo Frank,
schau mal auf http://www.boutell.com/openfaq/cgi/25.html, der 2. Weg der da beschrieben wird
funktioniert einwandfrei; Rolf