Leser: 23
1 2 3 4 5 6 7 8 9 10 11 12 13 14
sub create_link($) { my $filehandle = shift(@_); my $max_wartezeit = 3; my $fehler = ''; sysopen ($filehandle, "sysopentest.txt", O_RDWR | O_CREAT, 0600) or $fehler = $!; if (!$fehler) { my $start = time; while(!flock($filehandle,LOCK_EX|LOCK_NB) && time-$start<$max_wartezeit){ sleep 1; } $fehler = 'Timeout on flock' if !flock ($filehandle, LOCK_EX | LOCK_NB); } return $fehler; }
2009-08-08T19:36:59 sid burnWenn du flock() aufrufst dann wartet der Befehl solange bis es die datei locken kann.
2009-08-08T23:39:55 pqnicht, wenn man es mit LOCK_NB aufruft (NB steht für non blocking). es kehrt dann bei nichterfolg sofort zurück.
2009-08-08T19:36:59 sid burnflock() liefert NICHT den Status zurück ob eine Datei gelockt wurde oder nicht. Sondern es wartet bis es die datei locken kann, lockt es und fährt dann fort.
2009-08-10T09:49:48 freddy*nach oben schieb*
2009-08-10T10:20:25 TaulmarillLass mich raten: du arbeitest auf Windows?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
sub create_link($) { my $fh = shift(@_); my $max = 10; my $err = ''; sysopen($fh, "sysopentest.txt",O_RDWR|O_CREAT,0600) or $err=$!; if (!$err) { my $start = time; my $flock = flock($fh,LOCK_EX|LOCK_NB); while (!$flock && time-$start < $max) { print "Flock: >$flock< warte 1\n"; sleep 1; $flock = flock($fh,LOCK_EX|LOCK_NB); } $err = 'Timeout on flock' if !$flock; } return $err; }
2009-08-10T16:46:57 freddyAlso insofern aus meiner Sicht unter Windows sauberes flock() gemacht. Warum das bei meinem Ursprungscode irgendwie nicht wollte, weiß ich jetzt auch nicht mehr.
2009-08-10T16:52:09 pqdu hast im erfolgsfall, also nach dem ersten aufruf in der schleife, nochmal flock aufgerufen.
$fehler = 'Timeout on flock' if !flock ($filehandle, LOCK_EX | LOCK_NB);
2009-08-10T18:01:19 pqder fehler war, dass du es nach dem erfolgreichen flock nochmal aufgerufen hast. das hat unter linux funktioniert, da man dort flock mehrmals auf demselben handle aufrufen kann, unter windows anscheinend nicht.
so oder so ist es sinnlos, es mehrmals aufzurufen, nach der schleife hast du den lock ja.