Вместо вызова waitpid
в обработчике сигналов, почему бы не создать цикл после того, как вы разветвили все процессы следующим образом:
while (pid = waitpid(-1, NULL, 0)) {
if (errno == ECHILD) {
break;
}
}
Программа должна висеть в цикле, пока не останется детей. Тогда он выпадет и программа продолжится. В качестве дополнительного бонуса, цикл будет блокироваться на waitpid
, пока дети бегут, поэтому вам не нужен цикл занят, пока вы ждете.
Вы также можете использовать wait(NULL)
, что должно быть эквивалентно waitpid(-1, NULL, 0)
. Если вам больше ничего не нужно делать в SIGCHLD, вы можете установить для него значение SIG_IGN.