Проблема с вашим подходом заключается в том, что вы будете блокировать ожидание до тех пор, пока не погибнет 1-й [0-й] ребенок, а в это время может умереть любой другой.
Вы можете:
(1) Используйте wait () вместо waitpid (). Это обработает любого из потомков, но заблокирует.
(2) опрос мертвых детей с использованием waitpid () и флага WNOHANG во время зацикливания.
(3) Настройте обработчик сигналов и поймайте сигналы SIGCHILD. Поместите цикл waitpid / WNOHANG в ваш обработчик, но сделайте перезапуск за его пределами.
например. Обработчик делает что-то вроде:
while ((child_pid = waitpid(-1, &status, WNOHANG)) > 0)
{
//set a flag or whatever; not wise to fork/exec in handler
}