Counter-Problem

Von: , Frage gestellt am So, 23. Dez 2001

Hallo!
Meine Homepage wird komplett aus einem Perl-Script erzeugt, dass die Daten aus externen Dateien ausliest. Ich habe in dem Script einen Counter eingebaut, der folgendermaßen aussieht:

open(FILE,"<counter");
flock(FILE, $LOCK_SH);
@counter=<FILE>;
flock(FILE, $LOCK_UN);
close(FILE);
$count=int($counter[0])+1;
open(FILE,">counter");
flock(FILE, $LOCK_EX);
print FILE $count;
flock(FILE, $LOCK_UN);
close(FILE);

In unregelmäßigen Abständen wird der Counterstand jedoch wieder auf 0 gesetzt (und dann natürlich auf 1 hochgezählt). Ich weiß leider nicht, mit welchem Browser dies auftritt, da ich es immer nur zwischendurch in meiner LOG-Datei sehe.
Hat jemand eine Idee, wie ich dieses Problem beheben kann?
Gruß
Dennis

1 Antworten zu dieser Frage

  1. Antwort von nach 2 Stunden 0 hilfreich
    Re: Counter-Problem

    open(FILE,"<counter");
    flock(FILE, $LOCK_SH);
    @counter=<FILE>;
    flock(FILE, $LOCK_UN);
    # Ab hier kann Dir jemand dazwischenfunken
    : close(FILE);
    : $count=int($counter[0])+1;
    : open(FILE,">counter");
    : flock(FILE, $LOCK_EX);
    : print FILE $count;
    : flock(FILE, $LOCK_UN);
    # ab hier ebenfalls - Datei noch nicht ge-flushed (also Wert 0) und der nächste liest bereits
    : close(FILE);
    :


    besser (sonst funkt Dir zwischen Lesen der Datei und Schreiben jemand dazwischen):

    open(FILE,"+<counter");
    flock(FILE, $LOCK_SH);
    my $counter = <FILE>;
    chomp $counter;
    $count += 1;
    seek(FILE, 0, 0);
    truncate(FILE, 0);
    print FILE $count;
    #unnötig flock(FILE, $LOCK_UN);
    close(FILE);
    


    Klaus

Keine passende Antwort gefunden? Jetzt eigene Frage stellen!