Escalated to Bugzilla from IssueTracker
I have tracked down the SIGCHLD issue. RHEL3 short-circuits signal delivery for signals who's default is SIG_IGN. __group_send_sig_info() ... if (sig_kernel_ignore(sig) && p->sighand->action[sig-1].sa.sa_handler == SIG_DFL) { rm_from_queue(sigmask(sig), &p->signal->shared_pending); return 0; } ... By adding a no-op signal handler for SIGCHLD, I was able to get the expected behavior on RHEL3 & 4. I'll investigate the possiblity of modifying RHEL3 to behave like RHEL4, but the RHEL3 behaviour is arguably correct.
Further digging (and close reading of 'man sigwait') points this out: sigwait suspends the calling thread until one of the signals in set is delivered to the calling thread. It then stores the number of the sig- nal received in the location pointed to by sig and returns. The signals in set must be **blocked and not ignored on entrance to sigwait.** If the delivered signal has a signal handler function attached, that function is not called. The customer's test program does not install any sort of signal handler for SIGCHLD. The default disposition of SIGCHLD is SIG_IGN, so the signal is implicitly ignored.