wait
ждет только одного ребенка.Вы должны вызывать wait(NULL)
в цикле, пока он не вернет -1
с errno == ECHILD
:
while (wait(NULL) != -1 || errno != ECHILD) { }
со страницы руководства wait (2):
ECHILD (for wait())
В вызывающем процессе нет ожидающих детей.
EINTR
WNOHANG не был установлен и обнаружен разблокированный сигнал или SIGCHLD;см. сигнал (7).
Таким образом, вы должны проверить ECHILD, чтобы вас не обманул пойманный сигнал.