Perché a volte la console necessita di un ripristino dopo CTRL + C


9

Alcuni strumenti di interfaccia a riga di comando restituiscono una console non funzionante quando vengono annullati da CTRL+C. A volte il testo è invisibile o ci sono problemi grafici fino a quando non eseguo il comando reset.

(Uso bash, ma mi aspetto che sia indipendente dalla shell.)

Questo effetto ha un nome? Cosa causa questo e in che modo i programmatori possono impedirlo negli strumenti? Esiste una strategia su come affrontare questo problema nei principali linguaggi di programmazione?



stty saneper le barbe grigie
Thorbjørn Ravn Andersen,

Risposte:


14

Una console a volte ha bisogno di un reset(1) (o qualche stty(1)comando) perché lo stato di uno pseudo-terminale non cambia quando termina un processo (ad es. Un programma avviato dalla shell).

Leggi il tty demistificato .

(Trovo che la gestione di pseudo-terminali e pseudotty sia la parte più difficile di Linux)

Esiste una strategia su come affrontare questo problema nei principali linguaggi di programmazione?

Un programma ben educato che si occupa del terminale e cambia modalità o disciplina di linea dovrebbe cercare di evitare il crash e inviare le chiamate appropriate (vedi termios (3) ) per mettere il terminale nello stato giusto. A proposito, le librerie come ncurses o readline sono utili (ma è necessario chiamare le loro routine di pulizia in modo appropriato).

Vedi segnale (7) e sicurezza del segnale (7) . Evitare arresti anomali nel codice è difficile. Leggi il comportamento indefinito .

Una soluzione imperfetta potrebbe essere quella di definire una funzione shell che esegue il programma e quindi esegue una reset(che a volte potrebbe essere inappropriata).


Questa soluzione alternativa non è eccezionale; a volte resetpuò risultare in sttyimpostazioni diverse da quelle originali.
Bob,

Sì, grazie per averlo sottolineato. Ho aggiunto "imperfetto".
Basile Starynkevitch l'

Ho letto i tuoi link, erano interessanti, ma sarebbe utile se tu potessi aggiungere un puntatore a una sezione per questo Q / A ciascuno. Dopo aver letto demistificato tty, ho iniziato stty -a > /tmp/test1in bash quindi un comando, che ho annullato. Il colore del terminale era ora rosso. stty -a > /tmp/test2ma test1ed test2erano esattamente gli stessi.
Jonas Stein,

1

La risposta a questo problema non è completamente indipendente dalla shell. In zsh, c'è il ttyctlbuiltin, che può "congelare" o "sbloccare" la modalità tty. Non credo che ci sia un equivalente in bash. Il settycomando in tcsh fa la stessa cosa, ma è molto più preciso: puoi congelare le singole impostazioni.

Il congelamento della modalità tty significa solo che zsh ricorderà la modalità corrente e, se qualche bambino futuro la modifica, la modalità verrà ripristinata quando il bambino sospende o termina.

Questo ti proteggerà da alcuni dei cattivi effetti dei programmi che si arrestano in modo anomalo o non riescono a ripulire il terminale. Devi ricordarti di sbloccare se vuoi apportare una modifica stty, altrimenti la shell annulla immediatamente qualunque cosa tu abbia sttyfatto.

resetfa più delle sttymodalità di ripristino , quindi potresti ancora averne bisogno a volte, ma non spesso.


In effetti: ho avviato stty -a> / tmp / test1 in bash, quindi un comando, che ho annullato. Il colore del terminale era ora rosso. stty -a> / tmp / test2 ma test1 e test2 erano esattamente gli stessi. Ho provato lo stesso con tcsh, ma non sono riuscito a interrompere il comando da CTRL + C. I colori sono rimasti bene.
Jonas Stein,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.