Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery

Re: Sleeping and reaping

by jwest (Friar)
on Jan 14, 2003 at 22:35 UTC ( #226987=note: print w/replies, xml ) Need Help??

in reply to Sleeping and reaping

Assuming you have a well-behaved POSIX system, one option is to block the SIGCHLD signal until you're ready to handle it:

#!/usr/bin/perl use strict; use POSIX qw(:signal_h); $|++; my $pid = fork(); if ($pid) { my $sigset = POSIX::SigSet->new; my $blockset = POSIX::SigSet->new(SIGCHLD); $SIG{CHLD} = sub { print "$$: Reaping a child process in child + signal handler ...\n" }; sigprocmask(SIG_BLOCK, $blockset, $sigset)); print "$$: Parent sleeping 5 seconds at [".localtime()."] ...\ +n"; sleep 5; print "$$: That was refreshing. The time is now [".localtime( +)."].\n"; sigprocmask(SIG_SETMASK, $sigset); exit(0); } else { print "$$: \tChild sleeping for 2 seconds ...\n"; sleep 2; print "$$: \tChild exiting at [".localtime()."] ...\n"; exit(0); }

The caveat to this, aside from its untested-ness, is that when you unblock SIGCHLD, even if more than one SIGCHLD signal was received, you'll only get one.

To adjust for that, your parent process should keep track of its children and do a non-blocking waitpid for each child when the signal comes in. If waitpid returns a positive non-zero value, which is presumably the pid that you just waited on, you can perform the clean-up action.

In fact, it's arguable that if you do this at regular intervals, you can leave $SIG{CHLD} = 'IGNORE' - unless you're really into signal handling.

Hope this helps!


-><- -><- -><- -><- -><-
All things are Perfect
    To every last Flaw
    And bound in accord
         With Eris's Law
 - HBT; The Book of Advice, 1:7

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://226987]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others drinking their drinks and smoking their pipes about the Monastery: (3)
As of 2018-05-22 21:48 GMT
Find Nodes?
    Voting Booth?