Hallo,
Nummer 4 oder Konstante LOCK_NB bedeutet non-blocking (nur in Verbindung mit 1 oder 2 bzw. LOCK_SH oder LOCK_EX erlaubt und beendet den Zugriffsversuch auf die Datei sofort statt zu warten, bis ein Zugriff möglich ist).
Öhm, das habe ich auf meinem UNIX noch nicht beachten können.
Ich verwende LOCK_EX auf ein Dummi-File, und der spätere Prozess wartet. Er bricht nicht ab.
Folgende Beispielprogramme:
Shared-Lock auf eine Datei acquirieren:
#!/usr/bin/env perl
use warnings;
use strict;
use Fcntl ':flock';
open DATEI, '<', 'counter.txt';
flock DATEI, LOCK_SH;
print "Schlafen...\n";
sleep (5);
close DATEI;
Exklusives Lock auf eine Datei acquirieren, dabei aber LOCK_NB angeben:
#!/usr/bin/env perl
use warnings;
use strict;
use Fcntl ':flock';
open DATEI, '<+', 'counter.txt';
if (flock DATEI, LOCK_EX | LOCK_NB) {
print "Datei gesperrt!\n";
} else {
print "Datei nicht gesperrt!\n";
}
close DATEI;
[Ginge auch umgekehrt mit LOCK_EX und LOCK_SH oder mit zwei Mal LOCK_EX - das ist nur eine Demonstration. Fehlerbehandlung ist auch nicht drin, counter.txt muss man vorher anlegen.]
Wenn ich in einem Fenster das erste Script laufen lasse und während es pausiert in einem anderen Fenster das zweite Script laufen lasse, dann erhalte ich "Datei nicht gesperrt". Wenn ich nur das zweite Script laufen lasse, erhalte ich "Datei gesperrt". Wenn ich aus dem zweiten Script das OR mit LOCK_NB entferne, wartet das zweite Script auf das Ende des ersten und acquiriert dann das Lock.
Funktioniert also exakt so, wie in der Doku beschrieben.
Viele Grüße,
Christian