Skip to content
/linux-syscalls

Processus & Threads · Section 2

exit_group(2)

Termine immédiatement tous les threads du groupe de threads appelant.

Signature

#include <sys/syscall.h>

void exit_group(int status);
status
Code de sortie. Seuls les 8 bits bas sont observables par wait4/waitid ; conventionnellement 0 = succès, non-nul = échec. Status > 127 est conventionnellement réservé aux codes dérivés de signal.

Description

exit_group() termine tous les threads du groupe de threads appelant (c'est-à-dire le processus complet, au sens POSIX) avec le code de sortie indiqué. Contrairement à exit() — qui ne termine que le thread appelant — exit_group() parcourt l'ensemble du TGID et démonte chaque tâche. C'est ce qu'appellent finalement les wrappers exit() et _exit() de la glibc ; seul pthread_exit() (par thread) passe par sys_exit. exit_group() ne retourne jamais. Les 8 bits bas de status sont rapportés au parent via wait4/waitid (les bits hauts sont silencieusement ignorés — passer de petits entiers).

Numéros par architecture

ArchitectureNuméroABIPoint d'entrée
x86 (i386)252i386sys_exit_group
x64 (x86_64)231commonsys_exit_group
ARM64 (aarch64)94—sys_exit_group

Historique noyau

Introduit dans Linux 2.5.35.

  1. 2.5.35

    exit_group() a été ajouté en 2.5.35 (série NPTL) pour que la glibc puisse terminer tout un processus pthread en un seul appel, au lieu de boucler sur chaque thread et appeler exit() sur chacun (le comportement historique de _exit() jusqu'à NPTL).

seccomp & conteneurs

Docker default profile

Autorisé

Podman default profile

Autorisé

exit_group() et exit() doivent figurer dans tout profil par défaut et toute allow-list personnalisée. Les bloquer produit un processus zombie incapable de se terminer — le noyau délivrera SIGKILL en fin de compte, mais le diagnostic est désastreux. Toujours inclure SCMP_SYS(exit_group), SCMP_SYS(exit) et SCMP_SYS(rt_sigreturn) dans le minimum vital de tout filtre seccomp.

libseccomp

seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit_group), 0);
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(exit),       0);

Exemple strace

$ strace -e exit_group /bin/true
exit_group(0)                           = ?
+++ exited with 0 +++

exit_group() est toujours le dernier appel d'une trace ; coupler à -f pour suivre la démolition multithreadée. L'annotation 'status = ?' indique que le noyau ne revient pas de cet appel.

Sécurité & observabilité

exit_group() intéresse rarement directement les défenseurs — chaque processus en émet exactement un. Le tracepoint eBPF sched_process_exit se déclenche avec status ; couplé à sched_process_exec il donne le cycle de vie complet. Plus intéressants : les processus qui ne terminent jamais (démons longs sans activité), ou ceux qui sortent immédiatement après execve() d'un binaire privilégié (tentative d'exploit ratée). La supervision se concentre généralement sur l'exec, pas le exit.

Syscalls liés