Probleme mit flock
Stefan Joel
- perl
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?
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
aha und wie soll das dann aussehen? kann man das irgendwo abguggen?
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
Hi,
Peinlich peinlich peinlich: Sollte natürlich so aussehen: http://forum.de.selfhtml.org/archiv/2000_4/t22443.htm
mfg Andres Freund
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
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
$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);
Grüsse vom Alain