Grupuri de procese și sesiuni: getpgid(), setpgid(), setsid(), tcgetpgrp()… în Python

Procese (os) Python 3.0+ (Unix)

Gruparea proceselor în grupuri și sesiuni, folosită de shell-uri și servicii.

Sintaxă
os.getpgid(pid) / os.getpgrp() / os.setpgid(pid, grup) / os.setpgrp()
os.getsid(pid) / os.setsid()
os.tcgetpgrp(fd) / os.tcsetpgrp(fd, grup)

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ști PermissionError. Fă întâi fork și apelează-l în copil.

Comenzi înrudite