FLOCK - Betriebssystem
steve
- perl
0 Siechfred0 Steve1 Christian Kruse0 Steve
2 Christian Kruse0 Steve1 Christian Kruse0 Steve
Hallo zusammen,
unter Perl schreibe ich in eine Textdatei mit den Befehlem OPEN und PRINT. Nun möchte ich nach OPEN den FLOCK Befehl einsetzen:
my $gBSUNIX = 1;
if ($gBSUNIX) {flock($_[0], 2) || die("can't lock file, $!");}
Bis jetzt habe ich immer eine Variable eingesetzt.
Gibt es einen Befehl mit dem man prüfen kann, ob der FLOCK Befehl vom Betriebssystem unterstützt wird?
Danke im voraus
Tag steve.
Gibt es einen Befehl mit dem man prüfen kann, ob der FLOCK Befehl vom Betriebssystem unterstützt wird?
Nein, das tut Perl für dich, da flock zu den eingebauten Funktionen von Perl gehört. Du kannst nur auf den Rückgabewert reagieren, z.B. so, wie du es schon getan hast. Es geht allerdings auch eleganter, ändert aber nichts an der Vorgehensweise.
Siechfred
Hi Siechfred,
danke dir !
Habe noch folgende Frage:
Wenn ich aus einer Textdatei nur einen Wert lese, sollte man dann die Datei dann auch sperren (LOCK_SH / Shared Lock)
Was bringt das bei reinen Lesen?
bye
Steve
你好 Steve,
Wenn ich aus einer Textdatei nur einen Wert lese, sollte man dann die
Datei dann auch sperren (LOCK_SH / Shared Lock)Was bringt das bei reinen Lesen?
Wenn die Datei wirklich _immer_ nur gelesen wird, kannst du den Lock
weglassen. Wird sie aber auch geschrieben, dann solltest du sie sperren,
damit du nicht irgendwelchen Müll einliest. Beispiel:
Prozess a öffnet die Datei zum lesen, sperrt sie aber nicht. Nahezu
zeitgleich öffnet Prozess b die Datei zum schreiben und schreibt etwas
hinein, wird aber mitten im Schreib-Prozess vom Scheduler schlafen
geschickt. Prozess a liest nun weiter und liest die unvollständigen Daten
von Prozess b. Und schon hast du einen sehr schwer zu entdeckenden Bug in
deinen Scripten. Schwer zu entdecken ist er, weil er (ohne viel Erfahrung)
nicht reproduzierbar ist.
再见,
克里斯蒂安
Hi,
in der Sub 1 lese ich nur die Datei xyz.txt
in der Sub 2 lese und schreibe ich in die Datei xyz.txt
Dann ist es wohl besser wenn ich in Sub 1 auch die Datei mit LOCK_SH sperre, auch wenn ich nur Lese.
Bitte verbessere mich im Fehlerfall...
Bye
steve
Moin.
in der Sub 1 lese ich nur die Datei xyz.txt
in der Sub 2 lese und schreibe ich in die Datei xyz.txt
Annahme: Dein Script läuft als ein Prozess, es gibt an keiner Stelle ein fork(). Dann können Sub1 und Sub2 nie gleichzeitig laufen.
Und wenn Du sicherstellen kannst, daß Dein Script nur einmal aufgerufen werden kann, also niemals (!) ein zweites parallel läuft bzw. ein anderes Script auf die Daten zugreift, dann brauchst Du nicht einmal beim schreiben zu locken. Wer sollte das Schreiben dann unterbrechen?
ABER: Kannst Du verhindern, daß zwei User gleichzeitig Dein Script starten...?
Deshalb --> lock ist Pflicht!
Gruß Frank
你好 steve,
Gibt es einen Befehl mit dem man prüfen kann, ob der FLOCK Befehl vom
Betriebssystem unterstützt wird?
Jupp, Perl überprüft das für dich:
use Config;
use Carp qw/croak/;
our $has_flock = 1;
if(!$Config{'d_flock'} || $Config{'d_flock'} ne 'define') {
carp "Sorry, system doesn't have flock(2)! Locking will be unsafe!\n"
$has_flock = 0;
}
再见,
克里斯蒂安
Hi Christian,
kann ich dann einfach nur schreiben:
flock($_[0], 2);
Wenn das Betriebssystem das Sperren nicht unterstützt wird der Befehl einfach ignoriert.
Oder sollte man mit deiner Abfrage vorher prüfen, ob flock unterstütz wird.
Bye
Steve
你好 Steve,
Hi Christian,
kann ich dann einfach nur schreiben:
flock($_[0], 2);
Wenn das Betriebssystem das Sperren nicht unterstützt wird der Befehl
einfach ignoriert.
flock() produziert einen fatalen Laufzeitfehler, wenn es auf der Maschine
nicht implementiert wird. Ergo: besser prüfen und nur ein bedingtes flock(),
sonst beendet sich dein Script mit einer bösen Meldung.
Alternative: eval {flock($_[0],2);} und auf $@ prüfen. Wenn nach dieser
Anweisung $@ einen wahren Wert enthält, ist flock() auf der Maschine nicht
implementiert.
再见,
克里斯蒂安
Hi Christian,
danke Dir !
Weiter unten habe ich gefragt ob man auch bei reinen Lesebefehlen die Datei sperren soll?
Ich habe mal gelesen,, man sollte dieses tun. Aber was gibt das für einen Sinn?
Bye
Steve