Leser: 21
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#!/usr/bin/perl -w use strict; use warnings; use IO::Handle; STDOUT -> autoflush (1); use Fcntl qw(:DEFAULT :flock); my $log = 'testrw_log.txt'; if (sysopen (my $file,$log,O_WRONLY|O_TRUNC|O_CREAT)) { $file -> autoflush (1); my $z = 0; while (1==1) { $z ++; print $file "Test $z\n"; print STDOUT "Habe Zeile $z geschrieben\n"; sleep 1; } } else { print "Fehler $!\n"; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#!/usr/bin/perl -w use strict; use warnings; use IO::Handle; STDOUT -> autoflush (1); use Fcntl qw(:DEFAULT :flock); my $log = 'testrw_log.txt'; my $lzeile = 0; # dieser Wert wird vom Client JS/Ajax mitgebracht while (1==1) { if (sysopen (my $file,$log,O_RDONLY)) { my @zeilen = <$file>; close ($file); if (scalar @zeilen > $lzeile) { print "Neu:\n" . join ("",@zeilen[$lzeile..scalar @zeilen - 1]) . "\n"; $lzeile = scalar @zeilen; # an dieser Stelle wird dem Client der aktuelle Text sowie die letzte Nummer $lzeile übergeben } else { print "nichts neues, warte...\n"; } } else { print "Fehler $!\n"; } sleep 1; }
1 2 3 4 5 6 7 8
sysopen(my $fh, ...); if(flock($fh,LOCK_EX|LOCK_NB)) { print $fh ...; $fh->flush; flock($fh,LOCK_UN); } close($fh);
2010-12-07T06:17:50 biancaEin weiterer Schreibprozess wird zwar abgehalten, soweit so gut. Der Leseprozess darf jetzt aber auch nicht mehr dran.
2010-12-07T08:24:54 pqsolltest du das nächste mal vielleicht einfach dazuschreiben, dass du einen ungewöhnlich langen schreibprozess hast.
2010-12-07T09:23:50 pqdu kannst die datei geöffnet halten, aber nur zum eigentlichen schreiben locken.
wenn der schreibprozess also kontinuierlich läuft, kann der filehandle offen bleiben, aber nur beim schreiben einer zeile machst du vorher ein flock und danach gibst du den lock mit LOCK_UN wieder frei.
2010-12-07T09:12:04 biancasiehe mein Beispiel, da geht das ja draus hervor.