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
| Architecture | Numéro | ABI | Point d'entrée |
|---|---|---|---|
| x86 (i386) | 252 | i386 | sys_exit_group |
| x64 (x86_64) | 231 | common | sys_exit_group |
| ARM64 (aarch64) | 94 | — | sys_exit_group |
Historique noyau
Introduit dans Linux 2.5.35.
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.