Klaus Junge: PERL und Threadnumber (WWWBOARD.PL) ?

Hallo,

am Freitag hat Jörk mir einen PL-Script-Entwurf
zur Verfügung gestellt und nun bin ich halt am
Vokabeln pauken. In dem Zusammenhang hab' ich auch
in das Script WWWBOARD.PL von Matt Wright geschaut.
An einer Stelle wurde ich an die verlinkten Thread-
nummern erinnert, kann die Umstände aber noch nicht
beurteilen.

Am Anfang des Scripts wird aufgerufen:

############################

Get Data Number Subroutine

sub get_number {
   open(NUMBER,"$basedir/$datafile");
   $num = <NUMBER>;
   close(NUMBER);
   if ($num == 99999)  {
      $num = "1";
   }
   else {
      $num++;
   }
}

später dann:

sub increment_num {
   open(NUM,">$basedir/$datafile") || die $!;
   print NUM "$num";
   close(NUM);
}

Ich verstehe das so, dass er sich am Anfang die
Nummer holt und erst später die neu angepasste
zurückschreibt. Zwischenzeitlich ist die Datei
DATA.TXT geschlossen (?!).

Meines Erachtens kann das nur dann gutgehen,
wenn gewährleistet wäre, dass jeweils nur eine
Instanz des Programms laufen könnte.
Von modernen Betriebssystemen würde ich aber
eigentlich schon erwarten, dass mehre Instanzen
gleichzeitig aktiviert werden können.

Wie verhält sich das in Wirklichkeit?

Klaus

  1. Hallo Klaus,

    Ich verstehe das so, dass er sich am Anfang die
    Nummer holt und erst später die neu angepasste
    zurückschreibt. Zwischenzeitlich ist die Datei
    DATA.TXT geschlossen (?!).
    Meines Erachtens kann das nur dann gutgehen,
    wenn gewährleistet wäre, dass jeweils nur eine
    Instanz des Programms laufen könnte.

    Wenn Du mal etwas zurueckgehst in den juengeren Archivdateien hier, wirst Du auf Threads stossen, in denen Leute "es nicht glauben koennen" oder "wahnsinnig werden" <g>, weil irgendwas mit Messagenummern und File-Zuordnung nicht stimmte. Vermutlich ist da genau der Fall eingetreten, dass zwei Leute zeitlich so dicht einen neuen Script-Prozess angestossen haben, dass die Datei vom einen Prozess mittlerweile aktualisiert wurde, bevor sie vom anderen erneut geoeffnet wurde.
    Aus der Welt schaffen koennte man das durch Einsatz der Perl-Funktion flock(), die es erlaubt, geoeffnete Dateien vor dem Zugriff anderer Prozesse zu schuetzen. Das wuerde allerdings in dem jetztigen Zustand des Scripts bedeuten, dass der zweite Prozess die Datei mit dem Zaehlerstand eben nicht oeffnen kann und deshalb stirbt. Da schaut er dann auch dumm, der User <g>. Man muesste das Script also so umschreiben, dass es - falls die Datei mit dem Zaehlerstand aufgrund einer flock-Sperre nicht geoeffnet werden kann, den open-Befehl in einer Schleife mit gewissen Timeouts so oft wiederholt, bis er erfolgreich ist (= bis der andere Prozess mit einem entsprechenden flock-Aufruf die Zaehlerstanddatei wieder freigegeben hat).

    Wenn das jetzt aber sofort wieder zum Thema "Idee fuer's Forum" wird, werde ich wahnsinnig und kann's nicht glauben <g>.

    viele Gruesse
      Stefan Muenz

    1. Hallo Stefan,

      Wenn das jetzt aber sofort wieder zum Thema "Idee fuer's Forum" wird, werde ich wahnsinnig und kann's nicht glauben <g>.

      viele Gruesse
        Stefan Muenz

      nee, lass das bloss bleiben,
      wir brauchen Dich doch noch.

      Klaus