Hallo,
hallo,
ist ein paralleler Schreibzugriff auf eine Datei problemlos möglich?
Möglich ist es, aber nicht problemlos und auch nicht ratsam.
Warum nicht problemlos? Was könnte passieren?
Kann die Datei fehlerhaft geschrieben werden, wenn
die Prozesse gleichzeit nur die Zeile aktualisieren, in der sie
registriert sind?Genau das ist es meines Wissens, weshalb du keinen solchen "Verzicht" anstreben solltest. Der mögliche Zeitverlust, wenn die Prozesse aufeinander warten müssen, ist minimal.
Ich habe das mal getestet und konnte keine Fehler entdecken, was
nicht heißt, dass es doch schief gehen könnte. Aber ich würde gerne
wissen was das sein könnte.
Mein Skript (parallel.pl):
#!/usr/bin/perl
use strict;
use warnings;
use Fcntl qw(:DEFAULT :flock);
my $arg = "@ARGV";
die "Usage: $0 <zeile x>\n" unless $arg =~ /^zeile \d$/;
for (my $i=0 ; $i < 1000000 ; $i++) {
my $uptime = <F> if open(F,'<',"/proc/uptime") or die $!;
$uptime =~ s/\..*$//;
chomp($uptime);
sysopen(FILE,"./testdatei",O_RDWR) or die $!;
my $index = [];
my $int = 0;
while (<FILE>) {
my $line = $_;
$index->[$int] = tell(FILE);
if ( $line =~ /^#/ ) {
$int++;
next;
}
(my $col1 = substr($line,0,10)) =~ s/\s+$//;
(my $col2 = substr($line,10,10)) =~ s/\s+$//;
(my $col3 = substr($line,20,10)) =~ s/\s+$//;
if ($col1 eq $arg) {
$int--;
$col2++;
seek(FILE,$index->[$int],0);
printf FILE '%-10s', $col1;
printf FILE '%-10s', $col2;
printf FILE '%-10s', $uptime;
last;
}
$int++;
}
close FILE;
}
Meine Datendatei (testdatei) vor dem Start:
#12345678901234567890123456789
zeile 1 0 uptime
zeile 2 0 uptime
zeile 3 0 uptime
zeile 4 0 uptime
zeile 5 0 uptime
So schaute die Datei beim Start aus.
Dann habe ich die Prozesse gestartet:
./parallel.pl zeile 1 &
./parallel.pl zeile 2 &
./parallel.pl zeile 3 &
./parallel.pl zeile 4 &
./parallel.pl zeile 5 &
Meine Datendatei danach:
#12345678901234567890123456789
zeile 1 1000000 21277
zeile 2 1000000 21319
zeile 3 1000000 21281
zeile 4 1000000 21333
zeile 5 1000000 21338
Greez,
opi
Selfcode: ie:( fl:( br:^ va:) ls:] fo:) rl:( n4:? ss:| de:] ch:? mo:|