#!/usr/bin/env perl -l
use strict;
use warnings;
use constant SLEEP_TIME => 20;
my $pid = fork;
die "Can't fork()" unless defined $pid;
if ($pid) {
local $SIG{TERM} = sub {
print "Parent received signal: @_";
die "$$ committing suicide!\n";
};
{
local $SIG{TERM} = sub {
print "Parent received signal: @_";
print "$$ committing infanticide!";
kill TERM => $pid if kill 0 => $pid;
};
print "Parent: $$; Child: $pid";
print "Waiting on child ...";
waitpid($pid, 0);
}
print "Child terminated.";
print "$$ resting ...";
sleep SLEEP_TIME;
print "$$ rested and exiting.";
}
else {
print "Child: $$";
local $SIG{TERM} = sub {
print "Child received signal: @_";
die "Child died via signal handler.\n";
};
sleep SLEEP_TIME;
exit;
}
####
Parent: 36789; Child: 36790
Waiting on child ...
Child: 36790
Child terminated.
36789 resting ...
36789 rested and exiting.
####
Parent: 36797; Child: 36798
Waiting on child ...
Child: 36798
Parent received signal: TERM
36797 committing infanticide!
Child received signal: TERM
Child died via signal handler.
Child terminated.
36797 resting ...
Parent received signal: TERM
36797 committing suicide!
####
Parent: 36835; Child: 36836
Waiting on child ...
Child: 36836
Child received signal: TERM
Child died via signal handler.
Child terminated.
36835 resting ...
Parent received signal: TERM
36835 committing suicide!