Pourquoi la console a-t-elle parfois besoin d'une réinitialisation après CTRL + C

9

Certains outils d'interface de ligne de commande renvoient une console cassée lorsqu'ils sont annulés par CTRL+C. Parfois, le texte est invisible ou il y a des problèmes graphiques jusqu'à ce que j'exécute la commande reset.

(J'utilise bash, mais attendez-vous à ce qu'il soit indépendant du shell.)

Cet effet a-t-il un nom? Qu'est-ce qui cause cela et comment les programmeurs peuvent-ils empêcher cela dans les outils? Existe-t-il une stratégie pour résoudre ce problème dans les principaux langages de programmation?

Jonas Stein
la source

Réponses:

14

Une console a parfois besoin d'une reset(1) (ou d'une stty(1)commande) car l'état d'un pseudo-terminal ne change pas quand un processus (par exemple un programme démarré par votre shell) se termine.

Lisez le tty démystifié .

(Je trouve que la gestion des pseudo-terminaux et pseudottys est la partie la plus difficile de Linux)

Existe-t-il une stratégie pour résoudre ce problème dans les principaux langages de programmation?

Un programme bien comporté traitant du terminal et changeant son mode ou discipline de ligne devrait s'efforcer d'éviter de planter et d'émettre les appels appropriés (voir termios (3) ) pour mettre le terminal dans le bon état. BTW, les bibliothèques comme ncurses ou readline sont utiles (mais vous devez appeler leurs routines de nettoyage de manière appropriée).

Voir signal (7) et sécurité du signal (7) . Éviter de planter dans votre code est difficile. Lisez à propos de comportement indéfini .

Une solution de contournement imparfaite pourrait être de définir une fonction shell qui exécute votre programme puis fait un reset(ce qui pourrait parfois être inapproprié).

Basile Starynkevitch
la source
Cette solution de contournement n'est pas excellente; resetpeut parfois entraîner des sttyparamètres différents de ceux d'origine.
Bob
Oui, merci de l'avoir signalé. J'ai ajouté "imparfait".
Basile Starynkevitch
J'ai lu vos liens, ils étaient intéressants, mais ce serait utile, si vous pouviez ajouter un pointeur à une section pour ce Q / A chacun. Après avoir lu tty démystifié, j'ai commencé stty -a > /tmp/test1en bash puis une commande, que j'ai annulée. La couleur terminale était maintenant rouge. stty -a > /tmp/test2mais test1et test2étaient exactement les mêmes.
Jonas Stein
1

Répondre à ce problème n'est pas complètement indépendant du shell. Dans zsh, il y a le ttyctlbuiltin, qui peut "geler" ou "dégeler" le mode tty. Je ne pense pas qu'il y ait un équivalent en bash. La settycommande dans tcsh fait la même chose, mais de façon plus fine: vous pouvez figer les paramètres individuels.

Geler le mode tty signifie simplement que zsh se souviendra du mode actuel, et si un futur enfant le change, le mode sera restauré lorsque l'enfant suspendra ou se terminera.

Cela vous protégera de certains des effets néfastes des programmes qui plantent ou échouent à nettoyer le terminal. Vous devez vous rappeler de dégeler si vous voulez faire un changement avec stty, sinon le shell annulera immédiatement tout ce que vous avez sttyfait.

resetfait plus que des sttymodes de restauration , vous pouvez donc en avoir besoin parfois, mais pas souvent.


la source
En effet: j'ai commencé stty -a> / tmp / test1 en bash puis une commande, que j'ai annulée. La couleur terminale était maintenant rouge. stty -a> / tmp / test2 mais test1 et test2 étaient exactement les mêmes. J'ai essayé la même chose avec tcsh, mais je n'ai pas pu planter ma commande par CTRL + C. Les couleurs sont restées fines.
Jonas Stein