CPAN - AnyEvent, , , . , , perl. C .
use strict;
sub background (&) {
my $code = shift;
my $pid = fork;
if ($pid) {
return $pid;
} elsif ($pid == 0) {
$code->();
exit;
} else{
die "cant fork: $!"
}
}
my @work = ('sleep 30') x 8;
my %pids = ();
for (1..4) {
my $w = shift @work;
my $pid = background {
exec $w;
};
$pids{$pid} = $w;
}
while (my $pid = waitpid(-1,0)) {
if ($?) {
if ($? & 127) {
warn "child died with signal " . ($? & 127);
} else {
warn "chiled exited with value " . ($? >> 8);
}
my $npid = background {
exec $pids{$pid};
};
$pids{$npid} = delete $pids{$pid};
} else {
delete $pids{$pid};
if (my $w = shift @work) {
my $pid = background {
exec shift @work;
};
$pids{$pid} = $w;
}
}
}
source
share