my %kids; sub REAP { while((my $deceased = waitpid(-1, WNOHANG)) != -1) { delete $kids{$deceased}; } $SIG{CHLD} = \&REAP; } $SIG{CHLD} = \&REAP; while ($new_sock = $sock->accept()) { if(my $kid = fork) { $kids{$kid} = 1; # parent closes the client since # it is not needed close $new_sock; } else { die unless defined $kid; # if fork failed # the kid's work # ... exit; } }