pourquoi taper Ctrl + c arrêterait deux fois un processus en cours sous Linux?

24

Il existe des programmes Linux, par exemple vlc, qui recommandent de taper ctrl+ cdeux fois pour tuer leur exécution à partir d'un terminal si le programme ne s'est pas arrêté après le premier.

Pourquoi taper ctrl+ cfonctionnerait-il deux fois alors que la première fois ne fonctionnait pas?

719016
la source
6
[citation nécessaire]
Ignacio Vazquez-Abrams

Réponses:

35

Ce qu'il fait est entièrement spécifique à l'application. Lorsque vous appuyez sur ctrl+ c, l'émulateur de terminal envoie un signal SIGINT à l'application de premier plan, ce qui déclenche le "gestionnaire de signal" approprié. Le gestionnaire de signal par défaut pour SIGINT met fin à l'application. Mais tout programme peut installer son propre gestionnaire de signaux pour SIGINT (y compris un gestionnaire de signaux qui n'arrête pas du tout l'exécution).

Apparemment, vlc installe un gestionnaire de signaux qui tente de faire un nettoyage / une terminaison gracieuse lors de la première invocation, et revient au comportement par défaut consistant à terminer instantanément l'exécution lors de son deuxième appel.

Riccardo Murri
la source
3
Sur certains systèmes, le signal revient à SIG_DFL après un appel au gestionnaire (pour éviter d'appeler le gestionnaire deux fois sur le même signal); c'est ce qu'on appelle la sémantique SysV. De nombreux programmes ne redéfinissent pas le gestionnaire de signal aux paramètres d'origine du programme à la fin du gestionnaire. Ce serait normalement un bug de programmation. Pour plus d'informations sur la page de manuel signal (2) .
Arcege
16

SIGINT , le signal envoyé par Ctrl+ C, indique conventionnellement à un programme de se diriger vers sa boucle de traitement de commande principale, ou si cela n'a pas de sens, de sortir proprement. Certains programmes exécutent une procédure de nettoyage lorsqu'ils reçoivent un SIGINT. Si le programme est tellement foiré que la procédure de nettoyage échoue, dans certains programmes, un deuxième Ctrl+ Cprovoque la fermeture immédiate du programme. Cela revient à chaque auteur de programme.

Si un second Ctrl+ Cne tue pas le programme, essayez Ctrl+ \, qui envoie SIGQUIT , un signal plus violent (mais toujours capturable), ou essayez Ctrl+ Zde suspendre le programme puis la killcommande (par exemple, kill %1qui envoie SIGTERM , un signal conventionnellement moins violent que SIGQUIT, au travail numéro 1). Si tout le reste échoue, arrêtez le programme avec kill -KILL, également connu sous le nom d' kill -9envoi du signal inaccessible SIGKILL .

Gilles 'SO- arrête d'être méchant'
la source