Warum muss die Konsole nach STRG + C manchmal zurückgesetzt werden?

9

Einige Befehlszeilenschnittstellentools geben eine defekte Konsole zurück, wenn sie von abgebrochen werden CTRL+C. Manchmal ist der Text unsichtbar oder es gibt Grafikprobleme, bis ich den Befehl ausführe reset.

(Ich benutze Bash, erwarte aber, dass es unabhängig von der Shell ist.)

Hat dieser Effekt einen Namen? Was verursacht dies und wie können Programmierer dies in den Tools verhindern? Gibt es eine Strategie, wie dieses Problem in den wichtigsten Programmiersprachen angegangen wird?

Jonas Stein
quelle

Antworten:

14

Eine Konsole benötigt manchmal einen reset(1) (oder einen stty(1)Befehl), da sich der Status eines Pseudo-Terminals nicht ändert, wenn ein Prozess (z. B. ein von Ihrer Shell gestartetes Programm) beendet wird.

Lesen Sie die tty entmystifiziert .

(Ich finde den Umgang mit Pseudo-Terminals und Pseudottys der schwierigste Teil von Linux)

Gibt es eine Strategie, wie dieses Problem in den wichtigsten Programmiersprachen angegangen wird?

Ein gut erzogenes Programm, das sich mit dem Terminal befasst und dessen Modus oder Leitungsdisziplin ändert, sollte sich bemühen, Abstürze zu vermeiden, und die entsprechenden Aufrufe (siehe Termios (3) ) ausgeben , um das Terminal in den richtigen Zustand zu versetzen. Übrigens sind Bibliotheken wie ncurses oder readline hilfreich (aber Sie müssen ihre Bereinigungsroutinen entsprechend aufrufen).

Siehe Signal (7) und Signalsicherheit (7) . Es ist schwierig, Abstürze in Ihrem Code zu vermeiden. Lesen Sie mehr über undefiniertes Verhalten .

Eine unvollständige Problemumgehung könnte darin bestehen, eine Shell-Funktion zu definieren, die Ihr Programm ausführt und dann eine ausführt reset(was manchmal unangemessen sein kann).

Basile Starynkevitch
quelle
Diese Problemumgehung ist nicht großartig. Manchmal resetkann dies zu anderen sttyEinstellungen als den ursprünglichen führen.
Bob
Ja, danke, dass Sie darauf hingewiesen haben. Ich habe "unvollkommen" hinzugefügt.
Basile Starynkevitch
Ich habe Ihre Links gelesen, sie waren interessant, aber es wäre hilfreich, wenn Sie jeweils einen Zeiger auf einen Abschnitt für diese Frage / Antwort hinzufügen könnten. Nachdem ich tty entmystifiziert gelesen hatte, startete ich stty -a > /tmp/test1in bash dann einen Befehl, den ich abbrach. Die Terminalfarbe war jetzt rot. stty -a > /tmp/test2aber test1und test2waren genau das gleiche.
Jonas Stein
1

Die Reaktion auf dieses Problem ist nicht vollständig Shell-unabhängig. In zsh gibt es das ttyctleingebaute, das den tty-Modus "einfrieren" oder "auftauen" kann. Ich glaube nicht, dass es ein Äquivalent in Bash gibt. Der settyBefehl in tcsh macht dasselbe, aber feinkörniger: Sie können einzelne Einstellungen einfrieren.

Das Einfrieren des tty-Modus bedeutet nur, dass sich zsh an den aktuellen Modus erinnert. Wenn ein zukünftiges Kind ihn ändert, wird der Modus wiederhergestellt, wenn das Kind angehalten oder beendet wird.

Dies schützt Sie vor einigen der negativen Auswirkungen von Programmen, die abstürzen oder das Terminal auf andere Weise nicht bereinigen können. Sie müssen daran denken, das Einfrieren aufzuheben, wenn Sie eine Änderung vornehmen möchten stty, da sonst die Shell sofort rückgängig macht, was sttyauch immer Sie getan haben.

resetbietet mehr als nur Wiederherstellungsmodi stty, sodass Sie es möglicherweise manchmal, aber nicht oft benötigen.


quelle
In der Tat: Ich habe stty -a> / tmp / test1 in bash gestartet und dann einen Befehl, den ich abgebrochen habe. Die Terminalfarbe war jetzt rot. stty -a> / tmp / test2, aber test1 und test2 waren genau gleich. Ich habe das gleiche mit tcsh versucht, aber ich konnte meinen Befehl mit STRG + C nicht zum Absturz bringen. Die Farben blieben gut.
Jonas Stein