#!/usr/bin/env perl -l
use strict;
use warnings;
use autodie qw{:all};
use POSIX qw{WNOHANG};
my %children;
$SIG{CHLD} = sub {
local ($!, $?);
my $pid = waitpid(-1, WNOHANG);
return if $pid == -1;
return unless defined $children{$pid};
delete $children{$pid};
print "SIG{CHLD}: PID $pid ", kill(0 => $pid) ? 'NOT ' : '', 'reaped.';
};
print "PARENT($$): Before multi_dir() call";
multi_dir();
sub multi_dir {
for (0 .. 1) {
my $pid = fork;
die 'Undefined PID from fork()' unless defined $pid;
if ($pid) { # parent
$children{$pid} = 1;
print "PARENT($$): Started child process with PID: $pid";
print "PARENT($$): ", scalar keys %children, ' child processes';
}
else { # child
print "CHILD($$): New process started";
system 'echo PPID=$PPID PID=$$; sleep 1';
print "CHILD($$): system() finished";
}
exit; # <<<=== PROBLEM HERE!
}
}
####
sub multi_dir {
...
print "CHILD($$): system() finished";
exit; # <<<=== PROBLEM FIXED!
}
}
}
####
...
print "PARENT($$): Before multi_dir() call";
my $multi_dir_return = multi_dir();
if ($multi_dir_return) {
print "CHILD($multi_dir_return): exiting";
exit;
}
print "PARENT($$): After multi_dir() call";
sub multi_dir {
...
print "CHILD($$): system() finished";
return $$;
}
}
return 0;
}
####
if ($limit) {
@subs = @subs[1 .. $limit];
}
####
if (defined $limit and $limit > @subs) {
@subs = @subs[0 .. $limit - 1];
}
####
while (keys %children >= $max) {
}