import os os.waitid(idtype, id, options, /)
siginfo_t
(подробнее ниже).Функция os.waitid()
модуля os
дожидается завершения дочернего процесса.
Аргумент idtype
может быть (от этого зависит интерпретация аргумента id
):
os.P_PID
- дождаться дочернего элемента, PID
которого равен id.os.P_PGID
- ждать любого дочернего элемента, идентификатор группы выполнения которого равен id.os.P_ALL
- ждать любого дочернего элемента; идентификатор игнорируется.os.P_PIDFD
- дождаться дочернего процесса, идентифицированного идентификатором файлового дескриптора (дескриптор файла процесса, созданный с помощью os.pidfd_open()
).Аргумент options
представляет собой комбинацию флагов ИЛИ. Требуется хотя бы один из:
os.WEXITED
- заставляет сообщать о дочерних процессах, которые завершились, os.WSTOPPED
- заставляет сообщать о дочерних процессах, которые были остановлены доставкой сигнала, os.WCONTINUED
- заставляет также сообщать о дочерних процессах, если они были остановлены, но об их текущем состоянии не сообщалось с момента их остановки. Дополнительные необязательные флаги:
os.WNOHANG
- заставляет немедленно возвращать результат, если статус дочернего процесса не доступен немедленноWNOWAIT
- заставляет перевести дочерний элемент в состоянии ожидания, чтобы можно было использовать более поздний вызов wait*()
для повторного получения информации о статусе дочернего элементаВозвращаемое значение - это объект, представляющий данные, содержащиеся в структуре siginfo_t
, со следующими атрибутами:
si_pid
(идентификатор процесса)si_uid
(реальный идентификатор дочернего процесса)si_signo
(всегда signal.SIGCHLD
- дочерний процесс остановлен или завершен.)si_status (статус выхода или номер сигнала, в зависимости от
si_code`)si_code (возможные значения:
os.CLDEXITED,
os.CLDKILLED,
os.CLDDUMPED,
os.CLDTRAPPED,
os.CLDSTOPPED,
os.CLDCONTINUED`)Если указан os.WNOHANG
и в запрошенном состоянии нет соответствующих дочерних элементов, то возвращает None
. В противном случае, если нет подходящих дочерних элементов, которых можно было бы ожидать, возникает исключение ChildProcessError
.
Доступность: Unix, не WASI, не iOS.
Изменено в Python 3.13: эта функция теперь доступна и в macOS.
import os # создаем дочерний процесс pid = os.fork() # ненулевой pid указывает на родительский процесс if pid : # еще один дочерний процесс pid2 = os.fork() if pid2 : # Дожидаемся завершения всех дочерних процессов используя `os.waitid()` # тип идентификатора idtype = os.P_ALL # Т.к. тип идентификатора `os.P_ALL`, то `os.waitid()` будет ждать всех # дочерних элементов, а указанный идентификатор игнорируется. id = pid # Указываем вариант option = os.WSTOPPED | os.WEXITED status = os.waitid(idtype, id, option) print("\nРодительский процесс -") print("Статус завершенного дочернего процесса:") print(status) else : print("\nВторой дочерний процесс -") print("Process ID:", os.getpid()) print("Exiting") else : print("Первый дочерний процесс -") print("Process ID:", os.getpid()) print("Exiting")