LOCK_NB Verwendung
bearbeitet von plhi Tom,
> Wenn Du von "Parent" und "Client" sprichst, meist Du da vielleicht "Parent" und "Child"?
Child.
> Dass das Handle dann ggf. vererbt wurde und quasi dasselbe ist, ist dir schon klar?
Nein, es ist nicht dasselbe. Es wird in einer ganz anderen Package estellt. Perl:
~~~perl
package LfdNr;
# fortlaufende Nummern
# SYNOPSIS
# my $nr = do 'LfdNr.pm';
use strict;
use warnings;
use IO::File;
use Fcntl qw(:flock);
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 $!";
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;
}
my $nr = LfdNr::lfdnr();
~~~
Und das CGI-Script zum Testen
~~~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.: ".do "LfdNr.pm";
}
else{
$response = "Parent $$ with Nr.: ".do "LfdNr.pm";
}
$response;
} || $@;
~~~
Was auch Warnungen in de Status einer Exception erhebt, wie in meinem Fall ein undefinierer Wert für `$nr`. So stirbt der andere Prozess weil `$nr` nicht definiert ist, sofern ein `LOCK_NB` gesetzt wurde.
Das Verhalten ist unabhängig davon ob das OS ein advisory Lock oder mandatory Lock unterstützt.
Schöne Grüße.