#!/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) {
print "Parent: $$; Child: $pid";
local $SIG{TERM} = sub {
print "Parent received signal: @_";
kill TERM => $pid if kill 0 => $pid;
};
print "Waiting on child ...";
waitpid($pid, 0);
print "Child terminated.";
}
else {
print "Child: $$";
local $SIG{TERM} = sub {
print "Child received signal: @_";
die "Child died via signal handler.\n";
};
sleep SLEEP_TIME;
exit;
}
####
Parent: 28186; Child: 28187
Waiting on child ...
Child: 28187
... SLEEP_TIME seconds pass
Child terminated.
####
Parent: 28192; Child: 28193
Waiting on child ...
Child: 28193
... on another command line: kill -TERM 28192
Parent received signal: TERM
Child received signal: TERM
Child died via signal handler.
Child terminated.
####
Parent: 28201; Child: 28202
Waiting on child ...
Child: 28202
... on another command line: kill -TERM 28202
Child received signal: TERM
Child died via signal handler.
Child terminated.
####
Parent: 28405; Child: 28406
Waiting on child ...
Child: 28406
... SLEEP_TIME seconds pass
Child terminated.
####
Parent: 28419; Child: 28420
Waiting on child ...
Child: 28420
... kill -TERM 28419
Parent received signal: TERM
Child terminated.
####
Parent: 28430; Child: 28431
Waiting on child ...
Child: 28431
... kill -TERM 28431
Child terminated.