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

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

Ждет завершения дочернего процесса

Синтаксис:

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")