Hmm... das würde aber meinen gestrigen Beobachtungen wiedersprechen:
Nein, Du interpretierst nur falsch!
Ich habe ein Script A welches eine Datei öffnet, flockt, mit sleep() 7 Sekunden wartet und die Datei dann wieder schließt!
Dann habe ich ein Script B welches die SELBE Datei auch öffnet, flockt und sie sofort wieder schließt!
Dann hatte ich 2 Browserfenster offen das eine mit Script A, daß andere mit Script B. Ich starte nun Script A einfach so, es dauert 7 Sekunden, dann ist das Script fertig. Ich starte das Script B, ist SOFORT fertig. Nun ich starte ich Script A, 1 Sekunde später starte ich Script B und Script B (welches ja sofort fertig sein sollte) wird auch erst dann fertig, wenn Script A fertig ist. Folglich hat open() darauf gewartet, daß die Datei freigegeben ist!
Trugschluss: flock hat gewartet.
Um dies zu testen habe ich den flock()-Vefehl aus Script A mal rausgenommen und siehe da, obwohl Script A die Datei noch geöffnet hatte war Script B wieder sofort fertig (hat also diesmal nicht gewartet.)
http://cgi.xwolf.com/faq/cgitutor4.shtml
Zitat: "Wird eine Datei zum Schreiben geöffnet wird die Datei gelockt. Dies hat zur Folge, daß kein anderer Lesender oder Schreibender Prozess auf diese Datei zugreifen kann; Trifft ein open() auf eine gelockte Datei, wartet dieses so lange, bis die Datei geunlockt wurde und öffnet erst dann die Datei."
Definitiv falsch. Der Autor hat offensichtlich keine Ahnung von der Materie, wenn er soetwas schreibt. RTFM: "man flock" oder deutlicher "perldoc perlopentut":
File locking does not lock out another process that would
like to do I/O. A file lock only locks out others trying
to get a lock, not processes trying to do I/O. Because
locks are advisory, if one process uses locking and
another doesn't, all bets are off.
flock ist eindeutig advisory und ein open stoert sich nicht daran. Wenn Du es immer noch nicht glauben willst, hier zwei Skripte:
--------------------------------------------
#!/usr/local/bin/perl
script1.pl
open S1, ">>/tmp/test" or die "/tmp/test";
flock S1, 2;
sleep 200;
close S1;
print "script1.pl: close() ausgefuehrt\n";
---------------------------------------------
#!/usr/local/bin/perl
script2.pl
++$;
open S1, ">>/tmp/test" or die "/tmp/test";
print "geoeffnet!\n";
flock S1, 2;
print "flock() beendet!\n";
close S1;
---------------------------------------------
Zur script1.pl auf der Kommandozeile starten mit:
script1.pl &
Dann script2.pl aufrufen. Sieh und staune!
Was ist denn nun richtig? Ich kann mir irgendwie nicht vorstellen, daß open() sich nicht um das flock() schert, weil flock() ja sonst völlig sinnlos wäre, da man ja nicht VOR dem Öffnen der Datei prüfen kann ob eine Datei geflockt ist (hat man mir jedenfalls gesagt)
Du brauchst das nicht zu pruefen. Und ob Du es dir vorstellen kannst oder nicht, flock ist dennoch sinnvoll.
und wenn ich dann einfach eine Datei zum schreiben öffne, die geflockt ist und open() sich nicht drum kümmert, ist der Inhalt ja bereits nach dem öffnen weg, was bringt es mir also, wenn ich dann NACH dem open() prüfe ob die Datei geflockt ist???
Wenn Du zum Ueberschreiben oeffnest, wird ueberschrieben. Wenn Du nicht zum Ueberschreiben oeffnest, wird nicht ueberschrieben. Oeffne deine Dateien also im anfuegend oder zum gleichzeitigen Lese- und Schreibzugriff (Stichwort '+<').
Peter