Сообщить об ошибке.

Функция waitpid() модуля os в Python

Ждет завершения процесса с определенным PID

Детали этой функции различаются в Unix и Windows.

Синтаксис:

import os

os.waitpid(pid, options)

Параметры:

  • pid - int, идентификатор процесса,
  • options - int, опции ожидания.

Возвращаемое значение:

Описание:

Функция 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().

Примеры ожидания завершения процесса с определенным PID.

Чтобы дождаться завершения определенного процесса, используйте функцию 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)