I finally discovered why dcprod fails to wait for the filter processes. I suspected from the beginning that it was a flaw in the LinuxThreads implementation, but I thought it was that the signal handlers weren't correctly cloned. When I looked deeper, it turned out that LinuxThreads puts the cloned processes in different thread groups, even though Linux has had support for thread groups since the release of 2.4.
I was going to recommend everyone to upgrade their glibc, but then I found that not even the latest CVS version uses thread groups correctly.
I have begun writing a compensation for this issue in dcprod, so that the filter are both forked and waited for in the same thread, and hopefully I'll be done later tonight.