Signaux · Section 2
kill(2)
Envoie un signal à un processus ou à un groupe de processus.
Signature
#include <signal.h>
int kill(pid_t pid, int sig);- pid
- Cible. > 0 : PID précis. 0 : groupe de processus de l'appelant. -1 : tout processus signalable. < -1 : groupe de processus de PGID |pid|.
- sig
- Numéro de signal (SIGTERM = 15, SIGKILL = 9, SIGINT = 2…) ou 0 pour tester existence/permission sans délivrer.
Description
kill() envoie le signal sig au processus identifié par pid. Sémantique de pid : > 0 envoie à ce PID précis ; 0 envoie à tout processus du groupe de processus de l'appelant ; -1 envoie à tout processus que l'appelant a le droit de signaler (sauf init) ; < -1 envoie à tout processus du groupe de processus |pid|. sig == 0 ne délivre rien mais vérifie les permissions — le moyen idiomatique de tester l'existence d'un PID sans l'affecter. L'appelant doit posséder la cible (même UID/EUID) ou détenir CAP_KILL. Retourne 0 en succès, -1 avec errno sinon. Le code moderne préfère pidfd_send_signal() pour éviter la course par réutilisation de PID qui peut faire que kill() touche le mauvais processus.
Numéros par architecture
| Architecture | Numéro | ABI | Point d'entrée |
|---|---|---|---|
| x86 (i386) | 37 | i386 | sys_kill |
| x64 (x86_64) | 62 | common | sys_kill |
| ARM64 (aarch64) | 129 | — | sys_kill |
Historique noyau
Introduit dans Linux 1.0.
1.0
kill() est présent dans Linux depuis 1.0 avec la sémantique POSIX.
5.1
pidfd_send_signal() a été ajouté pour référencer une cible par pidfd (obtenu via clone(CLONE_PIDFD), pidfd_open() ou /proc/<pid>) — éliminant la course de réutilisation de PID qui pouvait faire que kill() délivre au mauvais processus si l'original était sorti et son PID recyclé.
seccomp & conteneurs
Docker default profile
Autorisé
Podman default profile
Autorisé
kill() est autorisé par les profils Docker / Podman. Pour la plupart des charges conteneur, l'envoi de signal n'est nécessaire qu'entre sidecar et main, ou entre init et workers — donc pid == 0 (groupe de processus) et pid == self. Restreindre à self par filtrage d'arguments bloque le signalement latéral dans l'espace de noms PID du conteneur, durcissement utile si le modèle de threading le permet.
libseccomp
// Allow self-signalling only (pid == 0 or pid == getpid())
seccomp_rule_add(ctx, SCMP_ACT_ALLOW, SCMP_SYS(kill),
1, SCMP_A0(SCMP_CMP_EQ, 0));Exemple strace
$ strace -e kill bash -c 'kill -USR1 $$ &'
kill(12834, SIGUSR1) = 0strace décode sig symboliquement (SIGTERM, SIGKILL). Un 'kill(target, 0) = 0' suivi de 'kill(target, SIGTERM) = 0' est le motif canonique « est-il vivant, puis arrête-toi » des orchestrateurs. L'alternative moderne sans course apparaît en pidfd_send_signal() — bon à connaître pour lire du code récent.
Sécurité & observabilité
kill() vers PID 1 dans un conteneur est une évasion DoS courante — un processus compromis peut SIGKILL l'init pour crasher le pod. La plupart des runtimes positionnent SUBREAPER/racine d'espace PID de sorte que SIGKILL soit filtré, mais vérifier pour le runtime. Au-delà du DoS, kill() apparaît rarement dans les attaques — opération avec vérification de permission dans le même userns, abus inter-locataire naturellement borné. Le tracepoint eBPF sys_enter_kill capture pid et sig ; règles sur SIGKILL vers PID 1 ou sidecars connus sont à fort signal dans les EDR conteneurs.
Erreurs
- EINVAL
- sig n'est pas un numéro de signal valide.
- EPERM
- L'appelant n'a pas la permission — UID/EUID différents, pas de CAP_KILL, ou cible dans un autre espace utilisateur.
- ESRCH
- Aucun processus ou groupe avec ce pid. Avec sig == 0 c'est l'indicateur canonique « processus disparu ».