Hallo,
auch hier möchte ich Dir erst einmal danken. Ich habe auch diese Geschichte mal ausprobiert. Und möchte auch hier das Resultat kurz darstellen.
die zweite Instanz liest leere Daten, während die erste gerade speichert, und speichert dieselben später ab. Die Daten gehen also verloren.
Das ist ja katastrophal. Jetzt weiß ich wenigstens warum mir letzten eine Datei auf Null gesetzt wurde.
Du meinst vermutlich flock? Die Beschreibung dazu findest Du bei der bei Perl mitgelieferten Doku. Unter Windows in der HTML-Doku perlfunc, unter Unix schneller mit
stimmt natürlich.
perldoc -f flock
ich bin Linux-Neuling und total Windowsverseucht. Deshalb danke auch für diesen Tip. Hier jetzt allerdings ein Loblied auf Linux zu singen, würde wohl den Rahmen sprengen.
Ich habe die Sache übrigens sehr umständlich gelöst (weil ich flock selber nicht richtig verstehe *g*)[...]
Da bin ich aber beruhigt, daß auch ein Profi!? seine Schwächen eingesteht.
[...], indem ich vor jedem Schreibzugriff eine Dummy-Datei anlege, die sozusagen als Markierung dient. Vor jedem Lesezugriff prüfe ich in einer while-Schleife, ob diese Datei existiert. Vorsicht, es kann zu einer Endlosschleife führen, deshalb prüfe nur z.B. 10 mal und warte dazwischen mit select(undef,undef,undef,0.1) eine Zehntelsekunde (z.B.).
Die Idee ist famous. ich habe deshalb eine kleine Funktion erstellt, die genau das macht.
sub waittofileclose
{
$f = $_;
$isopen = "$filename.isopen";
$testagain = 0;
while ($testagain < 20)
{
if (open (TESTFILE, "$isopen"))
{
close (TESTFILE);
select(undef,undef,undef,0.1);
$testagain++;
}
else
{
$testagain = 20;
open (TESTFILE, ">$isopen");
close (TESTFILE);
}
}
}
Diese Funktion rufe ich vor dem eigentliche öffenen der eigentlichen zu bearbeitenden Datei auf. Wenn ich dann alle Aktionen an der Hauptdatei durchgeführt habe, lösche ich die Kontrolldatei mit dem Befehl unlink $isopen;
Sollte nun ein anderer Prozess in einer Warteschleife stecken, merkt dieser ja, daß die Datei entfernt wurde und kann nun seine Arbeiten durchführen. usw.
Vielleicht kann man ja noch alle 10 oder 100 Aufrufe ein Backup der Datendatei anlegen. Natürlich nur, wenn die Datendatei nicht die Größe Null hat. In diesem Fall müßte man das Backup zurückkopieren.
Fällt mir gerade ein, wo liegt den die Schmerzgrenze für die Größe einer zu lesenden Datei. Ich meine hier speziell, was passt in eine @Liste oder in einen $Scalar.
In 16-Bit Pascal kann ich in ein Listenelement 16.000 Einträge mit einer max. Länge von 255 Zeichen ablegen. (war schon öfters ein Problem) In 32-Bit bin ich bisher noch auf keine Grenze gestoßen. Wie ist es bei Perl.
Danke noch einmal
Hansi