Stefan Joel: Probleme mit flock

scheinbar funktioniert das bei mir nicht richtig da eine datei schon zweimal geschrottet wurde

nach dem ersten mal hab ich alle lesevorgänge mit flock folgendermaßen versehen:

$db_use_flock = 1;
$LOCK_EX = 2;

$i=0; @membadata="";
open (FILE, "$memberfile");
flock(FILE, $LOCK_EX) unless (!$db_use_flock);
while ( <FILE> ) { $membadata[$i] = "$_"; $i+=1; }
close (FILE);

alle schreibvorgänge ebenfalls mit nem
flock(FILE, $LOCK_EX) unless (!$db_use_flock);
hinter die open-zeile

leider wurde das file erneut geschrottet nach den änderungen, hab ich da irgendetwas falsch gemacht?

  1. Hallo,

    Du solltest Dir eigenen Funktionen für das Lesen und Schreiben in die Datei schreiben. Jede dieser Funktionen muss den Lockingstatus selbst abfragen. Es wird nämlich nicht wirklich auf der Dateiebene gesperrt, sondern nur eine Tabelle mit "Empfehlungen" angelegt. Wenn diese Tabelle von den einzelnen Teilen des Programms missachtet wird, dann hat das LOCK gar keinen Sinn.

    Das nennt sich advisory locking.

    Liebe Grüße aus http://www.braunschweig.de

    Tom

    --
    Intelligenz ist die Fähigkeit, aus Fehlern Anderer zu lernen und Mut die, eigene zu machen.
    1. aha und wie soll das dann aussehen? kann man das irgendwo abguggen?

      1. Hi,

        Ich hab über Google zufällig den Link gefunden:
        link:http://forum.de.selfhtml.org/archiv/2000_4/t22443.htm]. Ich denke das sollte helfen.

        mfg Andres Freund

        1. Hi,

          Peinlich peinlich peinlich: Sollte natürlich so aussehen: http://forum.de.selfhtml.org/archiv/2000_4/t22443.htm

          mfg Andres Freund

          1. Hallo,

            auf jeden Fall fängt auch jeder Thread mit dem Fehler an, dass eine Funktion benutzt wird, ohne ihr Ergebnis abzufragen.

            $fh=fopen("dteiname","r+");
            $lock=flock($fh, LOCKMODE);
            if ($lock)
            {

            ...

            }
            else
            ...

            LOCKMODE      Bedeutung
               1          shared, readOnly       Alle dürfen lesen, keiner soll schreiben
               2          exclusive, write       Kein Anderer soll lesen oder schreiben
                                                 der Lock-Setzer will gerade selber
                                                 schreiben.
                                                 Nur während des tatsächlichen Schreib-
                                                 vorgangs anwenden!
               3          Freigabe               Eintrag asu der Lock-Tabelle nehmen
               4          Vormerkung             Es ist noch ein anderer Benutzer an der
                                                 selben Datei. Es besteht also
                                                 kokurrierender Betrieb

            Musst Du mal über zwei Clients ausaprobieren, welche Möglichkeit des Einen welche Möglichkeit des Anderen mit false und welche mit true beantwortet.

            Wenn ein 1-Lock gesetzt ist, dürfte eigentlich nienamnd anders ein 2-Lock setzen dürfen. Wenn Du also vernünftige Programme schreiben willst, dann müsstest Du als erstes immer erst einen 2-Lock setzen. Wenn der Klappt, dann sofort auf einen 1-Lock zurückschalten. Ab jetzt kannst Du jederzeit wieder auf einen 2-Lock hochschalten. (wenn sich alle an dieses Verfahren halten).

            Es ist nämlich meiner Meinung nach möglich, dass zwei 1-Locks gleichzeitig gesetzt werden. Das musst du vermeiden. -> deadlock

            Diese Strategie liegt übrinens auch dem LowLevel-Locking von DOS und WinDOS zugrunde.

            Liebe Grüße aus http://www.braunschweig.de

            Tom

            --
            Intelligenz ist die Fähigkeit, aus Fehlern Anderer zu lernen und Mut die, eigene zu machen.
  2. Moin Moin !

    Arbeitest Du unter Windows ? Da geht flock gar nicht.

    In Sachen Locking steht übrigens einiges in der Perl-Doku, z.B. in perlfaq5 und perlopentut.

    Alexander

    --
    Today I will gladly share my knowledge and experience, for there are no sweeter words than "I told you so!"
    Mein "Lieblings-Forums-Bug": http://cforum.teamone.de/phpbt/bug.php?op=show&bugid=103&pos=2
    Nein, ich beantworte keine Fragen per eMail. Dafür ist das Forum da.
  3. Moin, ich habe hier ein beispiel aus einem script das funtzt,es handelt sich aber um ein dbfile:

    $doflocks = 1; print "Content-type: text/html\n\n"; $maxsize=$maxusers82; #uname+pass average length is 8 chars unlink($loginlog) if ((stat($loginlog))[7] > $maxsize);

    if (dbmopen(logins,$loginlog,0666)) {         flock(logins,2) if ($doflocks);         ($ip_last,$count_last,$date_last) = split(/*/,$logins{$username});

    #if first time logging in today         if ($date_last ne $date_today)         {                 $count_last=0;         }         elsif (($ip_last ne $ip_now) and ($agent ne /AOL/))         { blablabla   }

    $logins{$username} = "$ip_now*$count_last*$date_today";         dbmclose(logins);         flock(logins,8) if ($doflocks);

    ......blabla

    Grüsse vom Alain

    --
    ...nobody is perfect I am nobody