Jetzt wird interessant, Wenn ich alles zusammen in einer Package laufen lasse:
#!/usr/bin/perl
use strict;
use warnings;
use IO::File;
use Fcntl qw(:flock);
use v5.10;
$SIG{__WARN__} = sub{ die @_ };
$| = 1;
print "Content-Type: text/plain\n\n";
say eval{
my $pid = fork;
die "Can't fork" unless defined $pid;
my $response = '';
if( $pid == 0 ){
$response = "Child $$ with Nr.: ".lfdnr();
}
else{
$response = "Parent $$ with Nr.: ".lfdnr();
}
$response;
} || $@;
sub lfdnr{
my $file = "/home/netsh100633/files/nr.bin";
my $fh = IO::File->new;
$fh->open($file, O_CREAT|O_RDWR|O_BINARY) || die $!;
flock( $fh, LOCK_EX|LOCK_NB ) || die "Cannot lock $^E";
read( $fh, my $bin, 4 );
my $nr = unpack("N", $bin) || 1580;
$nr += 1;
$fh->truncate(0);
$fh->seek(0,0);
$fh->print( pack "N", $nr );
$fh->close;
return $nr;
}
Erscheint folgende Meldung:
Parent 3872 with Nr.: 1803
Cannot lock Der Prozess kann nicht auf die Datei zugreifen, da ein anderer Prozess einen Teil der Datei gesperrt hat
und das auch wieder unabhängig davon ob advisory oder mandatory Lock vom OS unterstützt wird.
Also:
-
Wenn in einer dedizierten Package mit
LOCK_EX|LOCK_NB
gelockt wird, gibt flock() TRUE zurück. -
Wenn jedoch alles in einer Package abläuft, siehe oben, gibt flock() FALSE zurück.
Ich frage mich trotz dieser unterschiedlichen Verhaltensweisen, für was ein LOCK_NB gut sein soll. Zum Erzeugen eindeutiger und fortlaufender Nummern macht ein LOCK_NB mit Sicherheit überhaupt keinen Sinn, denn die Anwendungen müssen sich darauf verlassen können daß sie eine eindeutige und fortlaufende Nummer bekommen.
Schöne Grüße.