Ce face Grupuri de procese și sesiuni: getpgid(), setpgid(), setsid(), tcgetpgrp()...
Procesele sunt organizate în grupuri (de exemplu toate procesele unei comenzi cu |) și grupurile în sesiuni (de obicei una pe terminal). getpgid(pid) și getpgrp() dau grupul unui proces, respectiv al celui curent; setpgid(pid, grup) și setpgrp() mută un proces într-un grup (setpgid(0, 0) creează un grup nou).
setsid() creează o sesiune nouă, desprinzând procesul de terminal (pas folosit la crearea serviciilor). getsid(pid) dă sesiunea. tcgetpgrp(fd) și tcsetpgrp(fd, grup) citesc și setează grupul din prim-plan al unui terminal.
Parametri
| Parametru | Descriere |
|---|---|
pid |
Procesul (0 = cel curent). |
grup |
Grupul de procese. |
fd |
Descriptorul terminalului. |
Ce returnează
Identificatori numerici sau None.
Exemple
Exemplul 1: Grup și sesiune nouă pentru un proces copil
import os
pid = os.fork()
if pid == 0:
print("copil în grupul părintelui:", os.getpgrp() == os.getpgid(os.getppid()))
os.setsid()
print("lider de sesiune:", os.getsid(0) == os.getpid(), os.getpgrp() == os.getpid(), flush=True)
os._exit(0)
os.waitpid(pid, 0)
pid = os.fork()
if pid == 0:
os.setpgrp()
print("grup nou:", os.getpgrp() == os.getpid(), flush=True)
os._exit(0)
os.waitpid(pid, 0)
Rezultat
copil în grupul părintelui: True
lider de sesiune: True True
grup nou: True
Exemplul 2: Grupul din prim-plan al terminalului
import os, sys
fd = sys.stdin.fileno()
print(os.tcgetpgrp(fd) == os.getpgrp())
pid = os.fork()
if pid == 0:
os.setpgid(0, 0)
os._exit(0)
os.setpgid(pid, pid)
os.waitpid(pid, 0)
Rezultat posibil (rulat direct într-un terminal)
True
Greșeli frecvente
- Apelezi
setsid()într-un proces care este deja lider de grup și primeștiPermissionError. Fă întâiforkși apelează-l în copil.
Comenzi înrudite
os.kill() și os.killpg(): Trimite un semnal unui proces sau unui grup de procese, de exemplu pentru a-l opri.os.fork() și os.register_at_fork(): Creează o copie a procesului curent; ambele continuă de la același rând.os.getpid() și os.getppid(): Identificatorul procesului curent și al procesului părinte.