Skip to content
/linux-syscalls

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

ArchitectureNuméroABIPoint d'entrée
x86 (i386)37i386sys_kill
x64 (x86_64)62commonsys_kill
ARM64 (aarch64)129—sys_kill

Historique noyau

Introduit dans Linux 1.0.

  1. 1.0

    kill() est présent dans Linux depuis 1.0 avec la sémantique POSIX.

  2. 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)                    = 0

strace 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 ».

Syscalls liés