Как проверить, все ли дочерние процессы закончились? - PullRequest
1 голос
/ 31 января 2020

Я пытаюсь создать задание, в котором я хочу проверить, завершился ли весь дочерний процесс, созданный студентами. Поскольку я не вызываю fork, у меня нет доступа к идентификаторам потоков. Есть ли способ проверить, не имеет ли текущий процесс дочерних элементов, не зная идентификаторов потоков созданных дочерних процессов?

Я проверил много вопросов, но каждое решение состоит в использовании возвращаемого значения из вызова fork. Любая помощь приветствуется.

Спасибо.

1 Ответ

1 голос
/ 31 января 2020

Вы можете вызвать

int st = waitpid(-1, NULL, WNOHANG);

Первый аргумент говорит waitpid() ждать завершения любого дочернего процесса, а не определенного c pid.

Третий аргумент флаг, который заставляет waitpid() немедленно возвращаться вместо блокировки.

Теперь есть три возможных результата:

  • возвращаемое значение -1 и errno равно ECHILD : это означает, что дочерний процесс вообще отсутствует
  • возвращаемое значение равно >0: это означает, что дочерний процесс завершился в прошлом, но возвращаемое значение еще не было собрано (так что называется зомб ie процесс). Теперь выполните итерацию процесса (снова вызовите waitpid()).
  • возвращаемое значение 0: в этом случае доступны дочерние процессы, которые все еще работают.

Это должно охватите все случаи, о которых вы просите.

...