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.
möchte meinen, daß dies die Serverleistung unnötig in Anspruch nimmt.
Vorschlag:
Konstanten fuer flock()
$LOCK_SH = 1;
$LOCK_EX = 2;
$LOCK_NB = 4;
$LOCK_UN = 8;
##########
open (DATEI, ">>datei.ext") or die ("$!: can‚t open datei.ext\n");
flock (DATEI, $LOCK_EX) or die ("$!: can‚t get lock\n");
print (DATEI "$string\n");
flock (DATEI, $LOCK_UN);
close (DATEI);
habe so bis jetzt noch keine bösen Überraschungen erlebt. :-)
Gruß Steffen