Secondo me la cosa piu' semplice e' utilizzare la sigaction affinche'
all'arrivo del segnale SIGCHLD (Ignorato per default) tu ti possa accorgere che il figlio e' terminato ed eventualmente intraprendere qualche azione particolare.

Esempio:
codice:
int main *int argc, char * argv[])
{
...
struct sigaction new, old;
new.sa_handler = miaGestione;
sigaction(SICGCHLD, &new, &old);
...
/*Adesso ogni volta che ricevi un SIGCHLD il controllo
passera' alla rotuine 'miaGestione'*/
}

void miaGestione(int sig)
{
/*Qui fai quello che "vuoi"...*/
}