perlquestion
Starky
I would like to have a parent process spawn a child to perform some task every 5 seconds. I would also like to perform some cleanup every time a child exits.
<P>
Unfortunately it appears that sleep exits prematurely when a CHLD signal handler is triggered; for example,
<P>
<CODE>
#!/usr/bin/perl
use strict;
$|++;
my $pid = fork();
if ($pid) {
# the parent does not exit prematurely when the handler
# is set to IGNORE
$SIG{CHLD} = sub { print "$$: Reaping a child process in child signal handler ...\n" };
print "$$: Parent sleeping 5 seconds at [".localtime()."] ...\n";
sleep 5;
print "$$: That was refreshing. The time is now [".localtime()."].\n";
exit(0);
} else {
print "$$: \tChild sleeping for 2 seconds ...\n";
sleep 2;
print "$$: \tChild exiting at [".localtime()."] ...\n";
exit(0);
}
</CODE>
results in
<CODE>
3978: Child sleeping for 2 seconds ...
3977: Parent sleeping 5 seconds at [Tue Jan 14 14:17:11 2003] ...
3978: Child exiting at [Tue Jan 14 14:17:13 2003] ...
3977: Reaping a child process in child signal handler ...
3977: That was refreshing. The time is now [Tue Jan 14 14:17:13 2003].
</CODE>
From the documentation for sleep, <TT>May be interrupted if the process receives a signal such as "SIGALRM"</TT>.
<P>
I can put the sleep in backticks, which seems to work albeit kludgily, but I am annoyed that putting it in backticks will result in a CHLD signal whenever the subprocess exits which means I have to worry about which child it was that exited when the child signal is caught.
<P>
My question to the monks is: How would those wiser in the ways of slumber do this?