Thread Fragen zu gleichzeitigem Dateihandling
(9 answers)
Opened by bianca at 2010-12-06 20:05
Nabend!
Hab hier ein Script, dass einige Sachen per FTP rumwurschtelt. Das dauert teilweise bis zu 5 Minuten. Nun möchte ich es gern so erweitern, dass man in einem <div> die aktuelle Aktion sehen kann. Will also vom Browser aus per JS/Ajax jede Sekunde an den Server gehen und die aktuellste Aktion abfragen. Dazu habe ich mal zwei Testscripte gebaut, die auch soweit parallel funktionieren: Schreibsimulation: Code (perl): (dl
)
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"; } Lesesimulation: Code (perl): (dl
)
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; } Meine Fragen an Euch: 1. Welches flock() muss ich im Schreibscript verwenden, damit nur dieser Prozess schreiben darf und beliebige andere lesen dürfen? Aus http://perl-howto.de/2008/06/sicheres-offnen-von-d... kann ich nicht genau entnehmen, was am besten ist. Derzeit ohne flock kann ich beliebig viele auch schreiben lassen, was natürlich nicht sein darf. Nur EINER soll schreiben dürfen und beliebig viele gleichzeitig lesen. 2. Gibt es eine schnellere Methode, das Lesescript auf die Daten zugreifen zu lassen? Derzeit wird die komplette Datei eingelesen, kann man das auch kürzen? Trennzeichen der Zeilen ist immer ein \n Vielen Dank! 10 print "Hallo"
20 goto 10 |