Leser: 21
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
sub CountAccess { my ($pid) = @_; my $filename = $PMroot.$PMcounter; my $Result = ""; my @FILE = (); open( FILE, "$filename" ); for my $line (<FILE>) { $line =~ tr-\n\r--d; push( @FILE, $line ); } close( FILE ); for my $i (@FILE) { if ($i =~ /$pid\=(.*?)/) { my $counter = $1; $counter += 1; $Result .= "$pid=$counter\n"; } else {$Result .= $i."\n";} } open( FILE, ">$filename" ); for my $line ($Result) { print FILE $line; } close( FILE ); }
2009-11-18T11:19:28 GwenDragonSelbst mit flock kann es passieren, dass in der kurzen Zeit zwischen open und flock der zweite Prozess zugreift.
Deswegen ist bei sowas sysopen sinnvoller.
2009-11-18T11:23:14 pqdeine schleife beim schreiben der datei ist irgendwie unnütz. wozu eine schleife über genau eine variable?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
sub CountAccess { my ($pid) = @_; my $filename = $PMroot.$PMcounter; my $Result = ""; my @FILE = (); use Fcntl qw/:DEFAULT :flock/; # importiert die Konstanten für sysopen() und flock() flock(FILE,LOCK_EX); # Exklusiver Lock sysopen(FILE, $filename, O_RDONLY); for my $line (<FILE>) { $line =~ tr-\n\r--d; push( @FILE, $line ); } close( FILE ); for my $i (@FILE) { if ($i =~ /$pid\=(.*?)/) { my $counter = $1; $counter += 1; $Result .= "$pid=$counter\n"; } else {$Result .= $i."\n";} } sysopen(FILE, $filename, O_WRONLY); print FILE $Result; close( FILE ); flock(FILE,LOCK_UN); # Lock wieder freigeben }
if ($i =~ /$pid\=(\d+)/)