Erik Wagner: Schankedön!! :o)

Beitrag lesen

Ich kenne Cheatah's Methode nicht. Wenn es etwas in der Art wie

while (-e 'datei.flock') {
  sleep 1;
}
open LOCK, ">datei.flock";
close LOCK;
...
unlink "datei.flock"

ist, dann ist flock auf jeden Fall vorzuziehen. Testen und Anlegen von datei.flock sind hier nicht atomar, daher kann es immer noch zu gleichzeitigen Zugriffen kommen. Das laesst sich vielleicht umgehen in dem man es so macht:

Ich mach das andersrum! Die Datei ist dann gelockt, wenn die flock-Datei NICHT existiert, denn löschen kann man die flockdatei nur einmal, meine lock-Funktion schaut so aus:

sub lock
{
  $timeout = 0;
  my $flockfile = $_[0];
  while($timeout <= 150)
  {
    if(-e "$flockfile")
    {
      if(unlink($flockfile) == false)
      {select(undef, undef, undef, 0.1); $timeout++;}
      else
      {return 1;}
    }else{
      {select(undef, undef, undef, 0.1); $timeout++;}
    }
  }
  return 0;
}

mit anderen Worten, wenn die flock-Datei existiert läuft zu dem Zeitpunkt kein Prozess der auf die dadurch zu sichernde Datei zugreift. Sollte zwischen der Abfrage ob die Datei existiert und dem Löschbefehl, die Datei bereits durch einen anderen Prozess gelöscht worden sein, wird das auch nochmal geprüft, die Grauzone dazwischen ist dann so gering, daß da nicht viel schiefgehen dürfte.

Das einzige was mich persönlich dabei wirklich stört ist die Sache mit einem möglichen Script abbruch zwischen lock() und unlock(), so daß die flock-Datei nicht wieder erstellt wird und dadurch alle nachfolgenden Prozesse lahmliegen...

Hmmm... ich schlaf da nochmal drüber...

Ciao, Erik