In a project I work on, we use a perl thrift server as a mock to simulate something in production. A C++ client connects, makes a call, and disconnects. The perl server is a forking server.
I found that if I do not explicity ignore SIGCHLD, I can accept one connection and process it, but when it disconnects, the subsequent accept call is interrupted by a SIGCHLD and results in a useless handle that can_read says cannot be read. This puts Server.pm into an infinite accept/read/fail loop. The serve() method of the ForkingServer needs to explicitly ignore SIGCHLD to work properly.
I've observed this behavior as far back as thrift-0.8.0 up through 0.9.3.
The workaround is to add the following code before calling serve():