os.wait(), waitpid(), wait3(), wait4(), waitid() și waitstatus_to_exitcode() în Python

Procese (os) Python 3.0+ (waitstatus_to_exitcode: 3.9+; Unix)

Așteaptă terminarea proceselor copil și află cum s-au terminat.

Sintaxă
pid, stare = os.wait()
pid, stare = os.waitpid(pid, optiuni)
os.wait3(optiuni) / os.wait4(pid, optiuni)
os.waitid(tip, id, optiuni)
os.waitstatus_to_exitcode(stare)

Ce face os.wait(), waitpid(), wait3(), wait4(), waitid() și waitstatus_to_exitcode()

wait() așteaptă orice proces copil, iar waitpid(pid, 0) pe unul anume; cu os.WNOHANG doar verifică, fără să aștepte. Returnează (pid, stare), unde starea este codificată; waitstatus_to_exitcode(stare) (3.9+) dă codul de ieșire sau minus numărul semnalului care a oprit procesul.

wait3() și wait4() returnează în plus resursele consumate de copil (timp de procesor, memorie). waitid(tip, id, optiuni) oferă control mai fin (tipurile P_PID, P_PGID, P_ALL; opțiunea WEXITED) și returnează un obiect cu si_pid, si_status, si_code.

Parametri

Parametru Descriere
pid Procesul așteptat (-1 = oricare).
optiuni 0, os.WNOHANG, os.WUNTRACED…

Ce returnează

Tupluri (pid, stare[, resurse]) sau un obiect waitid_result.

Exemple

Exemplul 1: Coduri de ieșire și resurse

import os
def copil(cod):
    pid = os.fork()
    if pid == 0:
        os._exit(cod)
    return pid

p1 = copil(0)
print(os.waitstatus_to_exitcode(os.waitpid(p1, 0)[1]))
p2 = copil(7)
pid, stare = os.wait()
print(pid == p2, os.waitstatus_to_exitcode(stare))
p3 = copil(1)
pid, stare, resurse = os.wait4(p3, 0)
print(os.waitstatus_to_exitcode(stare), resurse.ru_utime >= 0)
copil(2)
pid, stare, resurse = os.wait3(0)
print(os.waitstatus_to_exitcode(stare))
p5 = copil(9)
info = os.waitid(os.P_PID, p5, os.WEXITED)
print(info.si_pid == p5, info.si_status)

Rezultat

0
True 7
1 True
2
True 9

Greșeli frecvente

  • Nu aștepți procesele copil terminate: rămân în tabela sistemului ca „zombie” până când părintele apelează wait.
  • Folosești direct stare ca cod de ieșire: pentru exit(1) valoarea este 256. Folosește waitstatus_to_exitcode.

Comenzi înrudite