Pourquoi Ctrl-C ne tue-t-il pas le terminal lui-même?

36

Le terminal fonctionne lorsque nous l’ouvrons.

[email protected]:/$

Je viens de l'ouvrir. Donc, quand j'appuie sur Ctrl + C , pourquoi ne se tue-t-il pas et ferme le terminal?

    
posée luv.preet 07.03.2017 - 18:35
la source

5 réponses

43

Ctrl + C est le signal d’interruption. Lorsque vous tapez ceci dans un terminal, bash envoie SIGINT au travail au premier plan. S'il n'y a pas de travail (ce qui est le cas lorsque vous venez d'ouvrir un terminal), rien ne se passe. Le programme d'émulation de terminal n'est pas un travail exécuté dans le shell, il ne reçoit donc pas le signal et ne se ferme pas.

Si vous voulez fermer le terminal avec une clé de contrôle, utilisez Ctrl + D (EOF) pour que bash quitte (et ferme le terminal aussi).

Voir aussi: Guide de Bash Beginner sur les signaux et de manière plus approfondie Fonctionnement du traitement du signal
note: cette réponse a été modifiée car les commentaires étaient posté

    
réponse donnée Zanna 07.03.2017 - 18:47
la source
31

La frappe sur la touche ^ C , comme d’autres touches *, n’est pas magique - elle envoie un code d’accès au programme qui a le focus. (Dans X, le code clé est 54 pour le C avec un modificateur de 0x4 pour Ctrl .) Le programme qui reçoit le flux de clés est responsable de faire quelque chose de approprié avec eux - rappelez-vous que dans de nombreuses applications d’interface graphique, la copie de touches dans le presse-papiers est terminée.

Lorsqu'un émulateur de terminal graphique (par exemple, Konsole) ou un terminal virtuel reçoit une séquence de touches qu'il interprète comme ^ C , il peut effectuer l'une des trois opérations suivantes. Si le terminal est en mode raw , le programme en cours a demandé au terminal de ne pas exécuter aucune la gestion des touches spéciales et de les transmettre directement au programme. Certains programmes qui prennent en charge des fonctionnalités avancées, telles que l'édition de lignes, reçoivent des entrées de clavier dans certaines configurations entre des frappes au clavier complètes et des lignes de texte traitées. bash , par exemple, reçoit les frappes une par une. ^ C est interprété par le terminal, mais la clé de retour arrière est envoyée au shell tel quel.

Cependant, la plupart des programmes utilisent mode cuit (car il n’est pas brut), où le terminal interprète certaines séquences de touches avant de les envoyer au programme (c’est pourquoi vous pouvez utiliser backspace dans cat ). Dans ce mode, le terminal traduit lui-même la frappe ^ C en un signal SIGINT et l'envoie au processus fils. Comme le terminal a généré le signal, il ne sera pas confus et se terminera.

  • SysRq est vraiment magique.
réponse donnée chrylis 07.03.2017 - 19:50
la source
8

^ C est généralement mappé (voir stty -a ) au signal SIGINT (voir man 7 signal ).

Un SIGINT non intercepté interrompt le processus en cours, MAIS ...

SIGINT est l'un des signaux qu'un processus peut spécifier pour le comportement ("Catching a signal").

Ce que vous appelez "le terminal" attrape SIGINT et retourne au travail.

    
réponse donnée waltinator 07.03.2017 - 18:45
la source
7

Quand j'étais débutant, il me manquait le rôle que j'utilisais en utilisant la ligne de commande avec deux programmes distincts, un terminal et un shell (par exemple, bash)

Le shell est ce que vous connaissez probablement déjà, un programme qui prend en entrée des commandes ou des scripts, les exécute et imprime leur sortie.

Le terminal de l’autre côté est comme un homme entre l’utilisateur et un programme (lequel programme est généralement un shell comme bash ou fish). Ce que le terminal fait, par exemple, est de lire l’entrée du clavier, de traiter cette entrée d’une certaine manière et de la rediriger vers l’autre programme (bash).

Cela fonctionne également dans l'autre sens, lorsque l'autre programme produit quelque chose, que quelque chose est redirigé vers le terminal, alors c'est le travail du terminal de sortir ce quelque chose à l'écran. Entre la réception et l’impression sur l’écran, le terminal peut interpréter les entrées de différentes manières.

Par exemple si un programme affiche la séquence suivante:

\e[0;31m some extra foobar text

Le terminal affichera à l'écran "du texte supplémentaire" avec des lettres de couleur rouge. En effet, le terminal choisit de traiter ce code étrange de manière particulière , ce qui lui permet d’imprimer la sortie suivante en rouge.

De même, lorsque l'utilisateur appuie sur Ctrl - C , la seule chose particulière à ce sujet est que le terminal choisit de le traiter d'une manière spéciale, il n'y a rien d'autre de spécial dans cette séquence de touches. Plus précisément, cela le suggère d'envoyer le signal d'interruption (SIGINT) au processus qui s'exécute à l'intérieur du terminal, c'est-à-dire le shell. Si, à ce moment, il existe un programme généré par le shell et qui est actuellement exécuté au premier plan, il reçoit également le signal. Maintenant, le shell a un gestionnaire spécial pour ce signal et rien ne se passe. Mais la plupart des programmes ont les gestionnaires par défaut qui, dans le cas de SIGINT, sortent juste.

    
réponse donnée user183833 07.03.2017 - 21:21
la source
5

Chaque signal est associé à une action par défaut. L'action par défaut d'un signal est l'action effectuée par un script ou un programme lorsqu'il reçoit un signal.

Ctrl + C envoie le signal "interruption" ( SIGINT ), qui par défaut met fin au processus en cours d'exécution au premier plan .

Ctrl + D indique au terminal qu’il doit enregistrer un EOF sur l’entrée standard, que bash interprète comme un désir de exit .

Un processus peut choisir d’ignorer le signal INT et Bash le fait quand il est exécuté en mode interactif.

À partir du manuel :

  

Lorsque bash est interactif, en l’absence de pièges, il ignore   SIGTERM (pour que kill 0 ne tue pas un shell interactif), et   SIGINT est attrapé et manipulé (de sorte que l'attente interne est   interruptible). Dans tous les cas, bash ignore SIGQUIT. Si le contrôle du travail est   en effet, bash ignore SIGTTIN, SIGTTOU et SIGTSTP.

Comprenez-le avec piège :

Trap est une fonction intégrée au shell qui répond aux signaux matériels et autres événements. Il définit et active les gestionnaires à exécuter lorsque le shell reçoit des signaux ou d'autres conditions spéciales.

trap [-lp] [arg] [sigspec …]
     

-l imprime une liste de noms de signaux et de leurs correspondants   chiffres.
-p affiche les commandes d'interruption associées à chaque   SIGNAL_SPEC.

     

arg doivent être lus et exécutés lorsque le shell reçoit un signal   sigspec. Chaque sigspec est soit un nom de signal, soit un numéro de signal.   Les noms de signaux ne sont pas sensibles à la casse et le préfixe SIG est facultatif.

Si un sigspec est 0 ou EXIT , arg est exécuté lorsque le shell se ferme. Pour le comprendre, fermez terminal & amp; ouvrez-le après avoir édité la ligne suivante dans le fichier .bashrc .

trap 'notify-send "Ctrl D pressed"' 0

Ctrl D est similaire à la commande exit pour quitter le terminal.

Si vous souhaitez que Bash quitte le signal INT, même en mode interactif, vous pouvez ajouter ce qui suit à votre ~/.bashrc :

trap 'exit' INT

ou

trap 'exit' 2
    
réponse donnée d a i s y 08.03.2017 - 16:05
la source

Lire d'autres questions sur les étiquettes