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
stareca cod de ieșire: pentruexit(1)valoarea este 256. Foloseștewaitstatus_to_exitcode.
Comenzi înrudite
os.fork() și os.register_at_fork(): Creează o copie a procesului curent; ambele continuă de la același rând.os.WIFEXITED(), WEXITSTATUS(), WIFSIGNALED(), WTERMSIG() și celelalte: Interpretează starea returnată de wait(): ieșire normală, oprire printr-un semnal, suspendare.os.kill() și os.killpg(): Trimite un semnal unui proces sau unui grup de procese, de exemplu pentru a-l opri.