Infatti si. weit torna -1 se il processo che attende è finito.
Se non vuoi che il padre sia bloccato, devi procedere con la gestione dei segnali.
In altre parole devi catturare il segnale di terminazione del figlio ovvero SIGCHLD e gestire come meglio credi la situazione.
Ad esempio per quanto riguarda il codice del padre, inserisci questa riga dopo le fork:
signal(SIGCHLD, SIG_IGN);
Che serve per indicare che il segnale di terminazione deve essere ignorato.
Qualora non lo volessi ignorare, scrivi una subrutine che la gestisca e sostituisci la sua intestazione a SIG_IGN.