Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]5997[/thread]

Schreibsperre: use Fcntl ':flock';



<< >> 5 Einträge, 1 Seite
Free Faq
 2004-01-05 15:26
#78087 #78087
User since
2003-09-10
141 Artikel
BenutzerIn
[default_avatar]
Ich will eine Sperre einbauen, damit mehrere Leute nicht gleichzeitig in eine Datei schreiben können. Habe das so geschrieben:
Code: (dl )
1
2
3
4
5
use Fcntl ':flock';
open (FILE, "> $Datei");
flock(FILE, LOCK_EX);
print FILE $Data;
close (FILE);

Nun meine Fragen:
Funktioniert das?
Wie kann ich das testen?
Wie funktioniert es? -->
Gilt das nur für ein und das selbe Script oder auch für komplett andere Scripts, die nichts miteinander zu tun haben?
Haut mich nicht, ich bin ein Noob!
Relais
 2004-01-05 15:38
#78088 #78088
User since
2003-08-06
2244 Artikel
ModeratorIn
[Homepage] [default_avatar]
Jein, das funktioniert vermutlich schon...
doch sollte oder will man dazu vielleicht noch wissen, warum:

Code: (dl )
1
2
3
4
5
use Fcntl ':flock';
open (FILE, "> $Datei"); # Datei wird geöffnet, ist aber noch nicht geschützt.
flock(FILE, LOCK_EX); # Jetzt wird sie geschützt (*). In der Zwischenzeit hätte ein anderer Prozess unbehelligt schreiben können.
print FILE $Data; # Nun schreibst nur Du.
close (FILE);


*) Wenn das noch nicht durch ein anderes Flock der Fall ist. Dann wird gewartet, bis die Datei wieder frei ist, und später geht es bei (*) weiter.

Weitere Probleme:

Manche W32-Betriebssysteme unterstützen kein Flock. Perl kann das unter Umständen emulieren (meint mein Halbwissen), jedoch gilt das nur für Perl. Andere nichtperlige Prozesse kriegen davon vermutlich nichts mit und können dann das Lock nicht respektieren.

Auf allen Betriebssystemen könnten Prozesse das Flock absichtlich ignorieren. Flock zu beachten ist freiwillig (und geschieht etwa mit obigem Code).

[quote=Free Faq,05.01.2004, 14:26]Wie kann ich das testen?[/quote]

Etwa mit mehreren Prozessen, die Du in kurzer Folge nacheinander beauftragst, immer wieder mal in die Datei zu schreiben, während die anderen noch laufen.
Erst denken, dann posten --
26. Deutscher Perl- u. Raku -Workshop 15. bis 17.04.2024 in Frankfurt/M.

Winter is Coming
Free Faq
 2004-01-05 19:46
#78089 #78089
User since
2003-09-10
141 Artikel
BenutzerIn
[default_avatar]
Mein Server benutzt Linux.
Hab ich das richtig verstanden, das ich es umschreiben müsste?:
Code: (dl )
1
2
3
4
5
use Fcntl ':flock';
flock(FILE, LOCK_EX);
open (FILE, "> $Datei");
print FILE $Data;
close (FILE);


Gilt das nur für ein und das selbe Script oder auch für komplett andere Script-dateien, die nichts miteinander zu tun haben?
Werds gleich ausprobieren. Fände es aber besser, wenn mir das jemand bestätigen könnte.
Sicher ist sicher,...
Haut mich nicht, ich bin ein Noob!
Crian
 2004-01-05 21:35
#78090 #78090
User since
2003-08-04
5866 Artikel
ModeratorIn
[Homepage]
user image
So weit ich weiß, ist flock eine freiwillige Sache, und jeder Prozess, der auf die Datei zugreift, muss dann (freiwillig) flock aufrufen. Tut einer das nicht, so schreibt er, egal welcher andere Prozess gerade schreibt...
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
Free Faq
 2004-01-05 22:35
#78091 #78091
User since
2003-09-10
141 Artikel
BenutzerIn
[default_avatar]
gibt es eine andere möglichkeit, die richtig funktioniert?
Haut mich nicht, ich bin ein Noob!
<< >> 5 Einträge, 1 Seite



View all threads created 2004-01-05 15:26.