Souba SOUBA

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

Ctrl+C n'arrête pas vraiment un programme

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.

python
import time

try:
    while True:
        time.sleep(1)
except KeyboardInterrupt:
    # Ctrl+C arrive ici : le programme decide
    print("Arret propre, on nettoie...")
En Python, Ctrl+C lève une exception que le programme intercepte — il ne meurt pas tout seul.

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

  1. [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.
  2. [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.
  3. [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.
  4. [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.
ctrl+csigintsigkillsignalterminal

Aussi dans Shorts