hi 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:
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
#!/usr/bin/perl
use strict;
use warnings;
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 den 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.