The traditional way would be install a handler for SIGCHLD and
do a sigsuspend()/pselect()/ppoll(). Then when the suspend() returns,
you pump the status of any children with wait*(..., WNOHANG).
Does that not work for you for some reason?
Changing signal handlers is not what a library should do because they
are process-global (not even thread-specific).
Thanks,
Florian