Вы можете вызвать
int st = waitpid(-1, NULL, WNOHANG);
Первый аргумент говорит waitpid()
ждать завершения любого дочернего процесса, а не определенного c pid.
Третий аргумент флаг, который заставляет waitpid()
немедленно возвращаться вместо блокировки.
Теперь есть три возможных результата:
- возвращаемое значение
-1
и errno
равно ECHILD
: это означает, что дочерний процесс вообще отсутствует - возвращаемое значение равно
>0
: это означает, что дочерний процесс завершился в прошлом, но возвращаемое значение еще не было собрано (так что называется зомб ie процесс). Теперь выполните итерацию процесса (снова вызовите waitpid()
). - возвращаемое значение
0
: в этом случае доступны дочерние процессы, которые все еще работают.
Это должно охватите все случаи, о которых вы просите.