in reply to Script Creates Zombies

Line 148 is part of a signal handler for TERM, so you should only get that when someone is killing the process. The error is probably caused because the kill has been raised at a point when $client_sock is invalid. You can never be sure when a signal occurs, so the results may be inconsistent.
The TERM signal seems to be raised by the script if the accept times out.

The way in which the code sends USR1 signals to the parent is convoluted, and I should say that I have not spent the time to fully understand it. Perhaps you should read the design document for this script ;-)

A Zombie is created when a child is waiting for the parent to acknowledge the CHLD signal raised when the child is ending. This is usually cleared by the parent using a wait or waitpid (this is UNIX architecture, not specific to Perl). In your code, it looks like a USR1 signal has to be raised for the parent to do a wait(), and that is probably the issue here. Normally I would expect to see a wait or waitpid in the final 'else' block (the parent) after the fork.

Incidently, if the fork should fail (usually that would be if the number of processes exceeds some limit) then it returns undef, which you are not testing for.

Update: improved wording.