Детали этой функции различаются в Unix и Windows.
import os os.waitpid(pid, options)
Функция waitpid()
модуля os
в Unix: ждет завершения дочернего процесса, заданного идентификатором процесса pid
, и возвращает кортеж, содержащий его идентификатор процесса и индикацию состояния выхода, закодированную как для os.wait()
. На семантику вызова влияет значение целочисленных опций options
, которое для нормальной работы должно быть 0
.
pid
больше 0
, то os.waitpid()
запрашивает информацию о состоянии для этого конкретного процесса. pid
равен 0
, запрос относится к статусу любого дочернего элемента в группе процессов текущего процесса. pid
равен -1
, запрос относится к любому дочернему элементу текущего процесса. pid
меньше -1
, состояние запрашивается для любого процесса в группе процессов pid
(абсолютное значение pid
).Ошибка OSError
вызывается со значением errno
, когда системный вызов возвращает -1
.
Функция waitpid()
модуля os
в Windows: ждет завершения процесса, заданного дескриптором процесса pid
. Возвращает кортеж, содержащий pid
, а его состояние выхода сместится влево на 8 бит (смещение облегчает кросс-платформенное использование функции). Pid
меньший или равный 0
не имеет особого значения в Windows и вызывает исключение. Значение целочисленных опций не имеет никакого эффекта. pid
может относиться к любому процессу, чей идентификатор известен, но не обязательно к дочернему процессу. Функции os.spawn*()
, вызываемые с помощью P_NOWAIT
, возвращают подходящие дескрипторы процесса.
Для преобразования состояния выхода в код выхода можно использовать функцию os.waitstatus_to_exitcode()
.
Чтобы дождаться завершения определенного процесса, используйте функцию os.waitpid()
.
Функция os.waitpid()
, которой передан идентификатор целевого процесса, будет блокироваться до тех пор, пока процесс не завершится.
# test_waitpid.py import os import sys import time workers = [] for i in range(2): print(f'PARENT {os.getpid()}: Forking {i}') worker_pid = os.fork() if not worker_pid: print(f'WORKER {i}: Starting') time.sleep(2 + i) print(f'WORKER {i}: Finishing') sys.exit(i) workers.append(worker_pid) for pid in workers: print(f'PARENT: Waiting for {pid}') done = os.waitpid(pid, 0) print(f'PARENT: Child done: {done}') # $ python3 test_waitpid.py # PARENT 25144: Forking 0 # PARENT 25144: Forking 1 # WORKER 0: Starting # PARENT: Waiting for 25145 # WORKER 1: Starting # WORKER 0: Finishing # PARENT: Child done: (25145, 0) # PARENT: Waiting for 25146 # WORKER 1: Finishing # PARENT: Child done: (25146, 256)