Try changing your waitpid test to:
do {
$child = waitpid(-1,WNOHANG)
} while ( $child <= 0 );
and you might want to add a print statement in front of the "return" in your SIG handler to see if waitpid might be returning -1 for those other kids.
Update:
I completely overlooked this, but system does a fork call of its own, meaning that your SIG handler should catch those as well - so it really shouldn't be necessary to fork children who fork a single child... just catch the CHLD from the system call (?) (Nevermind, I see you're wanting to capture the PID for the resources hash)
I guess try the change in the loop and let us know what happens. That seemed to help my program (unless Linux's waitpid/wait4 is that much different than AIX (crosses fingers))