Ctrl+C n'arrête pas vraiment un programme
Ctrl+C ne « tue » pas un programme : le terminal le transforme en signal (SIGINT), que le programme peut gérer — ou ignorer. Le vrai arrêt sans appel, c'est kill -9.
55s · 20 juillet 2026 · 2 min de lecture
En bref
Quand tu fais Ctrl+C dans un terminal, la touche ne va pas au programme : le terminal la transforme en un signal, SIGINT, envoyé au programme du premier plan. Par défaut il s'arrête, mais le programme peut intercepter ce signal — nettoyer, demander confirmation, ou l'ignorer. C'est pour ça que certains programmes y résistent. Le seul ordre qu'aucun programme ne peut refuser, c'est SIGKILL : kill -9.
Un signal, pas un interrupteur
Dans un terminal, Ctrl+C n'envoie pas un ordre brutal au programme. La couche du terminal (la « line discipline », un bout de noyau) reconnaît la combinaison — le caractère ^C, code ASCII 3 — et la transforme en un signal nommé SIGINT (signal numéro 2). Ce signal est délivré au groupe de processus du premier plan : le programme qui occupe ton terminal.
Le programme a le dernier mot
Par défaut, SIGINT termine le programme. Mais SIGINT est « interceptable » : un programme peut installer son propre gestionnaire et décider quoi faire. Sauvegarder avant de quitter, demander « êtes-vous sûr ? », ou tout bonnement ignorer la demande. C'est pour ça que Vim ou nano ne meurent pas quand tu appuies sur Ctrl+C, et que Python te renvoie une erreur (KeyboardInterrupt) plutôt que de disparaître. Ctrl+C est une requête polie — pas une garantie.
import time
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
# Ctrl+C arrive ici : le programme decide
print("Arret propre, on nettoie...") Le seul arrêt sans appel : kill -9
Si un programme ignore Ctrl+C et refuse de partir, il reste deux signaux qu'il ne peut ni attraper, ni bloquer, ni ignorer : SIGKILL (numéro 9) et SIGSTOP (19). Le noyau agit directement. kill -9 met fin au processus immédiatement — mais sans aucun ménage : fichiers non sauvegardés, données potentiellement corrompues, processus enfants orphelins. C'est l'arme de dernier recours, pas le réflexe par défaut.
Ctrl+C (SIGINT)
- Une requête polie
- Interceptable et ignorable
- Le programme peut nettoyer
kill -9 (SIGKILL)
- Un arrêt sans appel
- Ni attrapable ni ignorable
- Aucun nettoyage, risque de corruption
→ On demande d'abord (Ctrl+C, SIGTERM) ; on force (kill -9) en dernier.
À retenir
- →Ctrl+C dans un terminal envoie le signal SIGINT (numéro 2) au programme du premier plan.
- →SIGINT est interceptable : le programme peut nettoyer, confirmer, ou même l'ignorer (d'où Vim, nano, Python).
- →Ctrl+C est une requête polie, pas un arrêt garanti ; une tâche en arrière-plan ne le reçoit même pas.
- →Le seul arrêt qu'aucun programme ne peut refuser, c'est SIGKILL (kill -9) — mais sans nettoyage, au risque de corrompre des données.
Sources · la preuve
- [01] Which Signal Does Ctrl+C Send? SIGINT Explained asmr.education · asmr.education ^C (ASCII 0x03 / ETX) transformé en SIGINT (n°2), délivré au groupe de processus du premier plan ; interceptable.
- [02] Linux Signals: Understanding SIGINT, SIGTERM, and SIGKILL FOSS Linux · fosslinux.com SIGKILL (9) et SIGSTOP (19) seuls non interceptables ; Vim attrape SIGINT et ne se ferme pas.
- [03] SIGINT And Other Termination Signals in Linux Baeldung · baeldung.com SIGINT = interruption demandée par l'utilisateur ; on ne doit pas s'y fier seul ; SIGKILL en dernier recours.
- [04] SIGINT vs SIGTERM vs SIGQUIT vs SIGKILL codestudy.net · codestudy.net SIGINT catchable/ignorable ; SIGKILL (9) non interceptable, risque de corruption et d'orphelins.