On Wed, 2002-04-17 at 19:06, Ahmed Moustafa wrote:
> > You are better off trying
> >
> > $SIG{CHLD} = 'IGNORE';
> >
> > at the top of your program and seeing if zombies are left out there.  If
> > so then you might want to use pop or shift like this
> >
> > waitpid shift @children while @children;
> 
> Do I really need to hold the pid's of the kids process somewhere?
> Can't I do something like that <code>my $forked =  fork; waitpid $forked,
> &WNOHANG;</code>?
> What do you think?
> 
> Thanks,
> 
> Ahmed

<DISCLAIMER>I am not an expert</DISCLAIMER>

<snip href="man 2 wait">
       WNOHANG
              which  means  to return immediately if no child has
              exited.
</snip>

This says to me that wait returns (after doing nothing) if it cannot
find a child to reap.  If I remember your application correctly you may
want to add a "wait &WNOHANG;" to your main loop removing the PIDs it
returns from your array (which might be better implemented as a hash
now) like this:

until ($terminate) { #main loop
        #do stuff that forks off children and stores
        #their PIDs in %running

        my $child = wait &WNOHANG;

        if ($child != -1) { #child just got reaped
                #$running{PID} should == 1 if the PID is really a child
                unless (delete $running{$child}) {
                        die "reaped a process I didn't know about";
                }
        }
}

#the main loop has exited, so we should check to see if there are
#any unreaped children
waitpid $_ for keys %running;  
        

        
 
-- 
Today is Pungenday the 35th day of Discord in the YOLD 3168
Hail Eris!

Missile Address: 33:48:3.521N  84:23:34.786W


-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to